如何计算Django中相同模型的不同字段的总出现次数?

时间:2019-07-10 08:10:26

标签: python django django-models

我正在尝试获取django中同一模型中某个字段出现的总数。有可能做到吗?

例如,我有一个如下模型:

class Blog(DateTimeModel):
    title = models.CharField(max_length=255)
    description = models.TextField()
    category = models.CharField(max_length=255, null=True, blank=True)

和以下数据表:

 id | title                               | description          | category
----+-------------------------------------+----------------------+----------
  1 | blog title first                    | description 1        | social
  2 | blog title second                   | description 2        | social
  3 | blog title third                    | description 3        | community
  4 | blog title fourth                   | description 4        | community
  5 | blog title fifth                    | description 5        | people

我希望结果为:

<QuerySet [{'category': 'social', 'blog_count': '2'}, {'category': 'community', 'blog_count': '2'}, {'category': 'people', 'blog_count': '1'}]>

我尝试做Blog.objects.values('category').order_by('category').distinct('category').count(),结果为3,这是正确的,因为它已经计算了与类别相关的总的不同值。

Django annotate count with a distinct field这篇文章提供了一种解决方案,其中我们可以基于两个模型对字段进行计数。但是我想要来自同一模型的结果。

1 个答案:

答案 0 :(得分:2)

您可以通过以下方式获取此类查询集:

from django.db.models import Count

Blog.objects.values('category').annotate(
    blog_count=Count('pk')
).order_by('category')

话虽如此,建模可能不是最佳的,因为它会创建很多数据重复。想象一下,如果您以后想要重命名category,那么这将导致大量工作,因为这些类别可以分布在很多表上。

然后实施Category模型,例如:

class Category(models.Model):
    name = models.CharField(max_length=255, unique=True)

class Blog(DateTimeModel):
    title = models.CharField(max_length=255)
    description = models.TextField()
    category = models.ForeignKey(Category, null=True)

然后,您可以注释Category对象,例如:

from django.db.models import Count

Category.objects.annotate(
    blog_count=Count('blog')
)