django过滤多对多 - set__id__没有做到准确

时间:2014-05-27 23:25:46

标签: django

我有模特:

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]的子集)

如果不清楚,请告诉我。

2 个答案:

答案 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个元素的最小子集?