モデルは次のとおりです。
class ModelA:
title = charfield
m2m = foreignkey, relatedname='m2ms'
これは機能しています:
ModelA.objects.filter(Q(title__icontains='a') & Q(title__icontains='b'))
そのため、タイトルに文字 'a' と 'b' の両方が含まれるすべてのレコードが返されます。
次に、多対多で同じことが機能しません:
ModelA.objects.filter(Q(m2ms__id=1) & Q(m2ms__id=2))
ModelA m2ms リスト:
for x in ModelA.objects.all():
print x.m2ms.all().values_list('id', Flat=True)
#Output:
1,2,3
1,2
1
1,3,5
4,6,7
1,8
したがって、ModelA.objects.filter(Q(m2ms__id=1) & Q(m2ms__id=2)) の期待される出力は、これらの m2m id: [1,2,3]、[1,2] を持つレコードである必要があります。しかし、それは起こっていません。なんで ?
Q(m2ms__id__in=[1,2]) __in=[1,2,3,4, 無限の数] を実行しても同じ結果が返されるため、使用できません
フィルターの代わりに Q を使用する理由は、この質問に記載されています - Q とともに多対多の django フィルター