Python Django 相当于 Elixir Ecto 中的预加载

Python Django equivelant of preloading in Elixir Ecto

所以我来自 Elixir 和 Phoenix Background,现在在 Django 项目中工作。

现阶段我正在研究 Django 的 ORM 部分,我有以下问题

假设模型如下

class Shop(models.Model):
    name = models.TextField()

class Product(models.Model):
    name = models.TextField()
    shop = models.ForeignKey(Shop)

此时在 Ecto 中您可以执行以下操作

shop = Context.get_by_id(1)
shop = preload(shop, :products)

结果是

%Shop{
 name: "Some name",
 products: [
   %Product{},
   %Product{}
 ] 
}

在幕后处理所有必要的连接查询使用 Django 时是否有类似的功能?

你应该可以用 select_related or prefetch_related in querysets

在你的情况下你可以这样做:

shop = Shop.objects.select_related('products').get(id=5)

shops = Shop.objects.prefetch_related('products').all()

select_relatedprefetch_related 在执行文档中的查询时存在差异。