クエリセットから一部の結果を除外する必要があります。この条件は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)
余分な不要なクエリが発生するため、このソリューションを使用する必要は避けたいと思います。