Django 1.6 ORM 计数相关项目的子集
Django 1.6 ORM count subset of related items
我有这些模型
class BlogEntry(models.Model):
tags = models.ManyToMany(Tag, ...)
...
class Tag(models.Model):
...
和标签的子集:
tag_list = list(*some tag objects*) # can refactor to queryset
我需要为我的标签列表中的每个 BlogEntry 获取标签数量,所以像这样:
# Non-working code ahead
BlogEntry.objects.annotate(match=Count(tags__in=tag_list))
我已经得到这个代码 运行 很好
# working code ahead
for entry in BlogEntry.objects.all():
match = len(set(entry.tags.all()).intersection(tag_list))
但我觉得在 python 而不是在数据库中进行计数和相交可能会造成性能问题。
请参阅 order of annotate() and filter() clauses 上的文档。
如该部分所述,如果您在注释之前进行过滤,则注释将仅包含与过滤器匹配的元素。所以:
BlogEntry.objects.filter(tags__in=tag_list).annotate(match=Count(tags))
我有这些模型
class BlogEntry(models.Model):
tags = models.ManyToMany(Tag, ...)
...
class Tag(models.Model):
...
和标签的子集:
tag_list = list(*some tag objects*) # can refactor to queryset
我需要为我的标签列表中的每个 BlogEntry 获取标签数量,所以像这样:
# Non-working code ahead
BlogEntry.objects.annotate(match=Count(tags__in=tag_list))
我已经得到这个代码 运行 很好
# working code ahead
for entry in BlogEntry.objects.all():
match = len(set(entry.tags.all()).intersection(tag_list))
但我觉得在 python 而不是在数据库中进行计数和相交可能会造成性能问题。
请参阅 order of annotate() and filter() clauses 上的文档。
如该部分所述,如果您在注释之前进行过滤,则注释将仅包含与过滤器匹配的元素。所以:
BlogEntry.objects.filter(tags__in=tag_list).annotate(match=Count(tags))