【问题标题】:Prefetch object with multiple levels of reverse lookups具有多级反向查找的预取对象
【发布时间】:2015-06-04 04:58:46
【问题描述】:

我使用的是 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 存在限制。谁能解释一下这里可能发生的事情?

谢谢 内森

【问题讨论】:

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


    【解决方案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 关系的属性。

    【讨论】:

      猜你喜欢
      • 2016-08-31
      • 1970-01-01
      • 2021-06-12
      • 2017-08-09
      • 1970-01-01
      • 2019-05-07
      • 2011-10-24
      • 2014-02-17
      • 2021-12-06
      相关资源
      最近更新 更多