与反向查找的多个级别的预取对象(Prefetch object with multiple leve

2019-10-22 11:09发布

我在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 。 如果我减少查找到一个反向查找(用于调试),它的作品没关系。

因此,无论有什么错我的代码,或预取的限制。 任何人都可以揭示可能被这里发生的一些轻?

由于弥敦道

Answer 1:

既然你抓住三个层次的深度预取数据的,酒店将存在于最后一个前的水平。 这意味着它是你必须做这样的事情来访问它:

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



文章来源: Prefetch object with multiple levels of reverse lookups