次のクエリがある場合
return Table.objects.filter(Q(cond1) | Q(cond2))
どの条件が特定の行を与えたかを知る方法はありますか?
次のクエリがある場合
return Table.objects.filter(Q(cond1) | Q(cond2))
どの条件が特定の行を与えたかを知る方法はありますか?
そうではありません。クエリは、次の SQL とほぼ同じです。
SELECT *
FROM Table
WHERE condition OR other_condition
django クエリと同じように、その特定の関係に対してどの条件がたまたま真であったかを知らせる自然な指標はありません。2 つのクエリを実行するか、リレーションに追加情報 (条件) を追加するか、条件自体を使用する必要があります。
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':
...