具有多级反向查找的预取对象

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 关系的 属性。