Django 中的 Q 查询
Posted
技术标签:
【中文标题】Django 中的 Q 查询【英文标题】:Q queries in Django 【发布时间】:2014-08-12 09:08:41 【问题描述】:如果我有以下查询
return Table.objects.filter(Q(cond1) | Q(cond2))
有没有办法知道哪个条件给出了特定的行?
【问题讨论】:
我需要查询不同的表,它们都共享原始表中的 PK 列。谢谢。 顺便说一句,问题的当前标题('')应该更具体。 【参考方案1】:不是真的,不。您的查询大致相当于以下 SQL:
SELECT *
FROM Table
WHERE condition OR other_condition
就像您的 django 查询一样,没有自然指标可以让您知道该特定关系的哪个条件恰好为真。您要么必须执行两个查询,要么向关系添加额外信息(条件),要么使用条件本身。
c1 = Q('name__exact'='Bob') # condition 1
c2 = Q('name__exact'='Mary') # condition 2
# use separate queries
set1 = Table.objects.filter(c1) # meets condition 1
set2 = Table.objects.filter(c2) # meets condition 2
# or use the natural condition
both = Table.objects.filter(c1|c2)
for item in both:
if item.name == 'Bob':
# condition 1
elif item.name == 'Mary':
# condition 2
【讨论】:
【参考方案2】:您可以将查询拆分为两个查询:
qs1 = Table.objects.filter(cond1).extra(select='condition': 'cond1')
qs2 = Table.objects.filter(cond2).extra(select='condition': 'cond2')
然后创建查询集的联合:
qs12 = qs1 | qs2
已编辑:使用 extra() 的查询集之间不支持联合
然后创建一个查询集链:
from itertools import chain
qs12 = list(chain(qs1, qs2))
并像这样使用它:
for obj in qs12:
if obj.condition == 'cond1':
...
elif obj.condition == 'cond2':
...
【讨论】:
以上是关于Django 中的 Q 查询的主要内容,如果未能解决你的问题,请参考以下文章
Django中的聚合/分组查询/F/Q查询/orm执行原生sql语句/ ORM事务和锁