Q запросов в Django
Если у меня есть следующий запрос
return Table.objects.filter(Q(cond1) | Q(cond2))
Есть ли способ узнать, какое условие дало конкретную строку?
2 ответа
Решение
Вы можете разделить ваш запрос на два запроса:
qs1 = Table.objects.filter(cond1).extra(select={'condition': 'cond1'})
qs2 = Table.objects.filter(cond2).extra(select={'condition': 'cond2'})
Затем создайте объединение наборов запросов:
qs12 = qs1 | QS2
EDITED: объединения не поддерживаются между наборами запросов с помощью extra()
Затем создайте цепочку ваших наборов запросов:
from itertools import chain
qs12 = list(chain(qs1, qs2))
И используйте это так:
for obj in qs12:
if obj.condition == 'cond1':
...
elif obj.condition == 'cond2':
...
Не на самом деле нет. Ваш запрос примерно эквивалентен следующему 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