【问题标题】:Django prefetch_related with reverse foreign key lookupDjango prefetch_related 与反向外键查找
【发布时间】:2018-10-16 01:23:22
【问题描述】:

鉴于Django docs中的这些模型:

class Topping(models.Model):
    name = models.CharField(max_length=30)

class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

我想用他们的 Pizza_set 做配料:

toppings = Topping.objects.all()

for topping in toppings:
   pizzas_with_this_topping = topping.pizza_set()
   # do stuff with pizzas_with_this_topping

如何使用 prefetch_related(或其他技术)来获取所有披萨数据,而不需要为每个 Topping 中的每个 Pizza 访问数据库?

【问题讨论】:

标签: django foreign-keys django-queryset


【解决方案1】:

像这样预取它们:

toppings = Topping.objects.prefetch_related('pizza_set')

那么以下内容不会命中数据库:

for topping in toppings:
    pizzas_with_toppings = topping.pizza_set.all()

我想补充一点,Django 努力使简单的事情易于使用(毫无疑问,Django 做得很好),但这显然使 Django 做了很多隐含的事情,这些事情从应用程序的代码,所以当你做一些高级的事情时,你应该预料到意外,阅读 Django 文档,其中阐明了所有的魔力,并使用 Django 调试工具栏等工具来验证一切是否如你所愿。

【讨论】:

  • 在我的情况下,似乎每次您在相关管理器上使用“.all”查询(又名:“..._set”)时,db 都会被命中。我使用 len(connection.queries) 检查了这个。不知道该怎么办。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2012-11-16
  • 1970-01-01
  • 2019-02-11
  • 2018-09-25
  • 2021-08-27
  • 2019-12-01
相关资源
最近更新 更多