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
Другие вопросы по тегам