一尘不染

Django queryset获取准确的多方查找

django

我有一个Tag模型实例的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>]

显然,调用.get()无效,因为它必须返回一个实例。

那么,如何检索单个实例?我必须注意,如果我的pk_list不同,例如。[10,6]或[10,6,3,7],那么我什么也得不到。我需要完全匹配。


阅读 387

收藏
2020-04-01

共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的节点。要完全匹配三个标签:

正确的答案是:

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)
2020-04-01