Django查询集可以获得精确多次查找

时间:2013-05-01 18:46:15

标签: django django-queryset django-orm

我有一个标签模型实例的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]然后我必须得到任何东西。我需要完全匹配。

由于

1 个答案:

答案 0 :(得分:24)

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

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@Adrián López,正确的答案是:

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)