使用反向外键查找的Django prefetch_related

时间:2018-05-05 20:40:19

标签: django foreign-keys django-queryset

鉴于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中的每个披萨点击数据库?

1 个答案:

答案 0 :(得分:2)

像这样预取它们:

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

然后以下内容不会命中数据库:

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

我想补充一点,Django很难用于简单的事情(毫无疑问Django做得很好),但这显然让Django做了许多隐含的事情,这些事情并不是立即显而易见的。应用程序的代码,所以当你做一些高级的事情时,你应该期待意想不到的,阅读Django文档,澄清所有的魔法,并使用像Django调试工具栏等工具来验证一切都按预期工作。