通过M2M关系从ID列表中选择记录

时间:2015-03-29 16:13:13

标签: django orm m2m

首先,抱歉我的英语不好,这个问题解释起来并不容易,所以我希望你能理解我。

我有以下2个型号:

class A(models.Model):
   code = models.CharField(unique=True, max_length=10)
   list_of_b = models.ManyToManyField('B')


class B(models.Model):
   code = models.CharField(unique=True, max_length=10)

我的目标是检索A的实例,它与给定的B ID列表完全匹配。

例如,假设我的数据库中有以下A记录:

id: 1 - code: X - list_of_b: [1, 2, 4, 6]
id: 2 - code: Y - list_of_b: [2, 5, 6]
id: 3 - code: Z - list_of_b: [2, 3, 4, 5, 6]

如果给定列表[2, 5, 6],我应该检索记录2和3,而不是1。

我成功检索到具有此查询的ids完全匹配的记录:

queryset = A.objects.prefetch_related('list_of_b')
queryset = queryset.annotate(nb=Count('list_of_b')).filter(nb=len(my_list))
for id in my_list:
    queryset = queryset.filter(list_of_b=id)

它适用于记录2但不适用于记录3。

感谢您的帮助。如果不够清楚,请不要犹豫我。 ;)

修改

还有一件事:my_list也可能包含的ID多于必要的ID。例如,[2, 5, 6, 7]我应该检索记录2和3.

1 个答案:

答案 0 :(得分:0)

只需按计数删除过滤器:

queryset = A.objects.prefetch_related('list_of_b')
for id in my_list:
    queryset = queryset.filter(list_of_b=id)