0

次のクエリがある場合

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

どの条件が特定の行を与えたかを知る方法はありますか?

4

2 に答える 2

1

そうではありません。クエリは、次の 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
于 2014-06-22T08:49:26.257 に答える
1

クエリを 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':
        ...
于 2014-06-22T07:39:26.787 に答える