【问题标题】:Python Django equivelant of preloading in Elixir EctoPython Django 等效于 Elixir Ecto 中的预加载
【发布时间】:2021-05-12 01:34:45
【问题描述】:

所以我来自 Elixir 和 Phoenix 背景,现在在一个 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 时,在后台处理所有必要的连接查询是否有任何类似的功能?

【问题讨论】:

  • 当然,这就是tutorial中解释的原因。
  • 哦,我从一本书开始,但我非常感谢您的领导!

标签: python django orm elixir ecto


【解决方案1】:

您应该可以在querysets 中使用select_relatedprefetch_related 完成此操作

你可以这样做:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2017-01-12
    相关资源
    最近更新 更多