具有多级反向查找的预取对象
Prefetch object with multiple levels of reverse lookups
我使用的是 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
...
这让我在 co = pt.checkouts_due
上获得 'ProductType' object has no attribute '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 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
...
这让我在 co = pt.checkouts_due
上获得 'ProductType' object has no attribute '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 关系的 属性。