2

クエリセットから一部の結果を除外する必要があります。この条件はbelong_to、オブジェクトの特定のリストにあるすべてのレコードを除外したいが、2 番目の値が特定の値ではないレコードを含めたいということです (レコードが除外されたレコードの 1 つに属していても)。

SQLでは、これは次のようになると想像しています:

SELECT * FROM some_table WHERE NOT (belongs_to_id IN [1,2,3] AND NOT foo=bar)

私はこれがうまくいくことを期待しています:

qs.exclude(Q(belongs_to__id__in=[1,2,3]) & ~Q(foo=bar))

ただし、結果を確認connection.queriesすると、djangoがその~Q(foo=bar)部分を省略しているようです。

参考までに、これは純粋な Python でも同じことを行います。

included_ids = qs.filter(foo=bar).values_list('id', flat=True)
excluded_ids = qs.filter(belongs_to__id__in=[1,2,3]).values_list('id', flat=True)
filtered_excluded_ids = [x for x in excluded_ids if not x in included_ids]
new_qs = qs.exclude(id__in=filtered_excluded_ids)

余分な不要なクエリが発生するため、このソリューションを使用する必要は避けたいと思います。

4

1 に答える 1

1

QI の予想外の結果を考えると、extraを使用する必要があると思います

qs.extra(where=['NOT ("customer_customer"."belongs_to_id" IN [%s] AND NOT "customer_customer"."sales_rep_id" = %d)'%(','.join(your_list),bar)])

Django クエリ構文自体が複雑な WHERE 句の表現に失敗することがあります (db バックエンドに依存する場合もあります...)。

そして、他の何かが失敗した場合 (たとえば、クエリがさらに複雑になった場合)、rawに行くことができます。

于 2013-01-28T22:29:38.090 に答える