Django的查询集得到确切多对多查找[复制](Django queryset get exact

2019-09-01 16:34发布

这个问题已经在这里有一个答案:

  • 如何做很多一对多的Django查询找书2名给出的作者吗? 3个回答

我有标签模型的实例的PK名单,说

pk_list = [10, 6, 3]

我有一个标签M2M领域的另一种模式,并完全包含3个标签的情况下(上述的PKS)。

class Node(models.Model):
    ...
    tags = models.ManyToManyField(Tag, related_name='nodes')

我想找回在我pk_list指定包含精确设定的标签节点。 当我做

Node.objects.filter(tags__in=pk_list)

它返回三个相同的实例列表

[<Node: My node title>, <Node: My node title>, <Node: My node title>]

调用获得()因为它必须返回一个实例,显然是行不通的。

所以,我怎么检索单个实例? 我必须指出,如果我的pk_list是不同的如。 [10,6]或[10,6,3,7]然后我必须接收什么。 我需要一个精确匹配。

谢谢

Answer 1:

一种方法是使用的过滤器链:

node_query = Node.objects.all()
pk_list = [10, 6, 3]

for pk in pk_list:
    node_query = node_query.filter(tags=pk)

现在node_query将匹配节点,具有与PK 10,6,3到三个标签精确匹配至少有三个标签:

更新 :感谢@janos和@阿德里安·洛佩斯 ,正确的答案是:

from django.db.models import Count

pk_list = [10, 6, 3]
node_query = Node.objects.annotate(count=Count('tags')).filter(count=len(pk_list))

for pk in pk_list:
    node_query = node_query.filter(tags__pk=pk)


文章来源: Django queryset get exact manytomany lookup [duplicate]