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

时间:2015-03-31 00:42:43

标签: django django-models django-queryset django-orm

我正在使用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' object has no attribute 'checkouts_due'上给我一个co = pt.checkouts_due。如果我将查找减少到单个反向查找(出于调试目的),它可以正常工作。

所以要么我的代码有问题,要么限制Prefetch。任何人都可以对这里可能发生的事情有所了解吗?

由于 森

1 个答案:

答案 0 :(得分:3)

由于您正在抓取预取数据的三个级别,因此该属性将存在于最后一个级别之前的级别上。这意味着你必须做这样的事情才能访问它:

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