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

标签 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'对象在co = pt.checkouts_due上没有属性'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 - 具有多级反向查找的预取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358729/

相关文章:

python - 内部类 - 继承和覆盖它们的属性

python - 将记录和字段列表保存到 django 模型中

python - 如何在具有 60 个功能的 1000 万行数据库上加速 Django 查询聚合?

mysql - Django - 查询外键 ID 时避免连接?

django - 我可以对查询集返回对象进行排序以便对结果进行排序吗

django - Django REST框架发布对象数组

css - Django 管理部分的默认 CSS 未加载

python - TypeError get_queryset() 缺少 1 个必需的位置参数 : 'pk'

python - 安装 psycopg2 失败 python 3.7

django - 如何将自定义表单添加到 django 管理页面内联