【问题标题】:Django 1.6 ORM count subset of related itemsDjango 1.6 ORM 计数相关项目的子集
【发布时间】:2015-10-10 17:50:00
【问题描述】:

我有这些模型

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 中而不是在数据库中进行计数和相交可能会导致性能问题。

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    请参阅order of annotate() and filter() clauses 上的文档。

    正如该部分所说,如果您在注释之前进行过滤,那么注释将仅包含过滤器匹配的元素。所以:

    BlogEntry.objects.filter(tags__in=tag_list).annotate(match=Count(tags))
    

    【讨论】:

    • 我从没想过这也适用于 ManyToManyFields,非常感谢!
    猜你喜欢
    • 2011-04-23
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2018-04-03
    • 2019-08-11
    • 1970-01-01
    相关资源
    最近更新 更多