gwa*_*dze 17 django django-orm django-queryset
比方说,我有一个标签模型的pk列表
pk_list = [10, 6, 3]
Run Code Online (Sandbox Code Playgroud)
我有另一个模型,m2m字段的标签和一个实例,其中包含3个标签(上面的pks).
class Node(models.Model):
...
tags = models.ManyToManyField(Tag, related_name='nodes')
Run Code Online (Sandbox Code Playgroud)
我想检索一个包含我的pk_list中指定的精确标记集的节点.当我做
Node.objects.filter(tags__in=pk_list)
Run Code Online (Sandbox Code Playgroud)
它返回三个相同实例的列表
[<Node: My node title>, <Node: My node title>, <Node: My node title>]
Run Code Online (Sandbox Code Playgroud)
调用.get()不起作用,因为它显然必须返回单个实例.
那么,我该如何检索单个实例?我必须注意,如果我的pk_list不同,例如.[10,6]或[10,6,3,7]然后我必须得到任何东西.我需要一个完全匹配.
谢谢
sta*_*alk 25
一种方法是使用过滤器链:
node_query = Node.objects.all()
pk_list = [10, 6, 3]
for pk in pk_list:
node_query = node_query.filter(tags=pk)
Run Code Online (Sandbox Code Playgroud)
现在node_query将匹配节点,该节点至少有三个标签,其中包含pk 10,6,3 .要精确匹配三个标签:
更新:感谢@janos和@ AdriánLó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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4267 次 |
| 最近记录: |