python - django Queryset filter(a__b__c=d): 获取 b 用于进一步过滤
问题描述
我正在编写一种计算复杂 Django 的方法QuerySet
。它是这样开始的
qs1 = A.objects.filter(b_set__c_obj__user=user)
qs1
最终将成为结果,但在此之前,该方法继续进行过滤和注释的几个进一步步骤。b_set
是 1:n 的关系,但我知道最多有一个c_obj
可以实际匹配。- 我需要引用 this
c_obj
,因为我需要它的另一个属性用于其中一个过滤步骤(这是针对基于's选择email
的另一个模型的实例)。D
c_obj
email
user
可以是User
模型实例或OuterRef
Django ORM 表达式,因为由该方法创建的整个查询集随后也将用于子查询。- 因此,任何涉及评估查询集的解决方案都不适合我。我只能构建一个查询集。
唔?
解决方案
我需要参考这个
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_obj
email='foo@bar.com
c_obj
type='user'
推荐阅读
- keras - CNN 识别能否回答“不是这些类中的任何一个”
- sql - 我可以准确查询结果吗
- java - 对整数输入进行排序时如何在输出中显示“主题”
- python - Python,日期时间对象
- python - 查找按钮重定向到的链接
- ssl - 支持 TLS 的通配符域:GKE 上的 Kubernetes Ingress
- javascript - 不理解 JavaScript 中的 2D 矩阵算法问题
- java - 导航 ArrayList
- machine-learning - python中添加输出层的难点
- ffmpeg - 使用 FFmpeg 将带有 A/52 B 音频(又名 E-AC3)的 MKV 转换为 AAC 的问题