Django注释计数不起作用总是返回1

时间:2019-07-29 09:50:09

标签: python django annotate

我的模特:

class PicKeyword(models.Model):
    """chat context collection

    """
    keyword = models.TextField(blank=True, null=True)

我的过滤器:

from django.db.models import Count
PicKeyword.objects.annotate(Count('keyword'))[0].keyword__count

结果总为1

就像:

print(PicKeyword.objects.filter(keyword='hi').count()

显示:     3

PicKeyword.objects.filter(keyword='hi').annotate(Count('keyword'))[0].keyword__count

显示:     1

是因为我使用sqllite还是我的关键字类型是Textfield?

3 个答案:

答案 0 :(得分:1)

以下将显示确切的计数:

PicKeyword.objects.annotate(Count('keyword')).count()

答案 1 :(得分:1)

您尝试在此处注释关键字数量的方式, PicKeyword.objects.annotate(Count('keyword'))[0].keyword__count
仅在您要总结多个对象之间的关系时才有效。由于keyword字段没有任何相关对象,因此输出始终为1(它是自己的实例)

作为queryset.annotate状态的API文档,

  

使用提供的查询表达式列表注释QuerySet中的每个对象。表达式可以是简单值,也可以是对模型(或任何相关模型)上字段的引用,也可以是针对与对象中的对象相关的对象计算出的聚合表达式(平均值,总和等)。 QuerySet。

Blog Model reference用于Queryset.annotate示例

最后,如果对象之间没有关系,而您的目标只是获取PicKeyword模型中的对象数,那么@samba和@Willem的答案是正确的。

答案 2 :(得分:0)

我遇到了完全相同的问题,没有答案对我有用。 我能够使用以下语法将其传递为1个字段作为值来工作(对我来说是有用的,因为我试图发现重复项):

dups = PicKeyword.objects.values('keyword').annotate(Count('keyword')).filter(keyword__count__gt=1)

以下内容始终返回空查询集,不应返回:

dups = PicKeyword.objects.values('keyword','id').annotate(Count('keyword')).filter(keyword__count__gt=1)

希望有帮助