我使用的是 Django 1.7,并且一直在使用新的 Prefetch
对象,这是一个很好的补充。然而,当我需要遍历不止一种关系时,我似乎陷入了困境。这是我的代码:
product_types = self.get_queryset().select_related().prefetch_related(
'excise_category__exciseitem_set__unit',
Prefetch(
'bevtank_set__package_set__checkout_set',
queryset=CheckOut.objects.filter(
create_date__lte=end_date,
submission__isnull=True,
exempt=False),
to_attr='checkouts_due'
)
)
...
for pt in product_types:
...
co = pt.checkouts_due
...
这给我一个'ProductType'对象在
。如果我将查找减少为单个反向查找(出于调试目的),它就可以正常工作。co = pt.checkouts_due
上没有属性'checkouts_due'
所以要么我的代码有问题,要么预取有限制。谁能解释一下这里可能发生的事情吗?
谢谢 内森
最佳答案
由于您要抓取三层深度的预取数据,因此该属性将存在于最后一层之前的层上。这意味着您必须执行类似的操作才能访问它:
bevtank_set__package_set__checkout_set
for pt in product_types:
for bevtank in pt.bevtank_set.all():
for package in bevtank.package_set.all():
co = package.checkouts_due
Django 不会将跨多个关系的预取合并到原始查询模型上的单个属性中。您必须深入查找与您最终想要的模型具有多对多或反向 FK 关系的属性。
关于django - 具有多级反向查找的预取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358729/