首页 > 解决方案 > django Queryset filter(a__b__c=d): 获取 b 用于进一步过滤

问题描述

我正在编写一种计算复杂 Django 的方法QuerySet。它是这样开始的

qs1 = A.objects.filter(b_set__c_obj__user=user)

唔?

标签: pythondjangodjango-queryset

解决方案


我需要参考这个c_obj,因为我需要它的另一个属性电子邮件用于其中一个过滤步骤(这是针对基于c_obj电子邮件选择的另一个模型 D 的实例)。

如果您使用相同的 .filter(…)子句进行所有过滤,那么c_obj所有条件都将是相同的。换句话说,如果您要过滤A以使其具有相关性B和相关性C,例如具有 asemail='foo@bar.com'和 as type='user',您可以使用以下方式进行过滤:

qs1 = A.objects.filter(
    b_set__c_obj__email='foo@bar.com',
    b_set__c_obj__type='user'
)

因此,这不同于:

qs1 = A.objects.filter(
    b_set__c_obj__email='foo@bar.com'
).filter(
    b_set__c_obj__type='user'
)

因为在这里它会寻找一个与 有关联的A对象和 一个(本质上不是一个)与。c_objemail='foo@bar.comc_objtype='user'


推荐阅读