3

モデルは次のとおりです。

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 フィルター

4

1 に答える 1

1

ドキュメントのこのセクションを読んでください。

特にこの段落:

これらの状況の両方を処理するために、Django には filter() および exclude() 呼び出しを処理する一貫した方法があります。単一の filter() 呼び出し内のすべてが同時に適用され、これらすべての要件に一致する項目が除外されます。連続した filter() 呼び出しは、オブジェクトのセットをさらに制限しますが、多値リレーションの場合、以前の filter() 呼び出しによって選択されたオブジェクトとは限らず、プライマリ モデルにリンクされたすべてのオブジェクトに適用されます。

そうしないとModelA.objects.filter(Q(m2ms__id__in=[1, 2]))ModelA.objects.filter(m2ms__id__in=[1, 2])期待どおりに機能すると思います。

于 2014-06-13T00:37:12.337 に答える