鉴于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中的每个披萨点击数据库?
答案 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调试工具栏等工具来验证一切都按预期工作。