我有模特:
ModelA, Conversation
class ModelA:
conversations = models.ManyToManyField(Conversation)
我想要检索ModelA的记录,该记录与id 1,2,3进行对话(比如说)。
我试过了:
ModelA.objects.filter(conversations__id__in=[1,2,3])
但这不是精确过滤器。如果记录A只有一个id为1的会话,则记录B只有一个id为2的会话而记录C有3个与id 1,2,3的会话,则上面的代码返回所有3个记录。但是,我想只检索记录C因为只有所有的对话1,2,3。
我需要准确或可能的子集。我的意思是,如果我搜索[1,2]然后记录A,B不应该来,但记录C可以来([1,2]是[1,2,3]的子集)
如果不清楚,请告诉我。
答案 0 :(得分:1)
参考Query using contains
each value in list,您可以使用in
字段查找执行相同的操作:
from django.db.models import Q
ModelA.objects.filter(reduce(operator.and_, (Q(conversations__id=x) for x in [1,2,3])))
# the above is equivalent to:
ModelA.objects.filter(Q(conversations__id=1) &
Q(conversations__id=2) &
Q(conversations__id=3))
答案 1 :(得分:0)
您需要链接查询以查找至少包含1,2和3的内容。
ModelA.objects.filter(conversations=1).filter(conversations=2).filter(conversations=3)
很久以前我回答了这样一个问题仍然有用: How to do many-to-many Django query to find book with 2 given authors?
至于你的上一个评论,[1]是[1,2]的子集,所以我不太清楚你试图过滤的逻辑是什么。一个子集,但是2个元素的最小子集?