在Django中进行Q查询

时间:2014-06-22 00:26:30

标签: django django-models django-views django-q

如果我有以下查询

return Table.objects.filter(Q(cond1) | Q(cond2))

有没有办法知道哪个条件给出了特定的行?

2 个答案:

答案 0 :(得分:1)

您可以在两个查询中拆分查询:

qs1 = Table.objects.filter(cond1).extra(select={'condition': 'cond1'})
qs2 = Table.objects.filter(cond2).extra(select={'condition': 'cond2'})

然后创建querysets的联合:

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':
        ...

答案 1 :(得分: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