【问题标题】:How to count total occurrence of distinct field of same model in django?如何计算 django 中相同模型的不同字段的总出现次数?
【发布时间】:2019-11-19 19:33:43
【问题描述】:

我正在尝试在 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 这篇文章提供了一个解决方案,我们可以基于两个模型计算字段。但我想要同一模型的结果。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

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

    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')
    )

    【讨论】:

    • 感谢您的回复。我有点困惑,如果我使用像Blog.objects.values('category').annotate(blog_count=Count('pk')) 这样的查询,我得到的结果是&lt;QuerySet [{'category': 'social', 'blog_count': '1'}, {'category': 'social', 'blog_count': '1'}, {'category': 'community', 'blog_count': '1'}, {'category': 'community', 'blog_count': '1'}, {'category': 'people', 'blog_count': '1'}]&gt;,但是当最后使用.order_by('category') 时,答案是预期的。
    • @dipbazz:那是因为如果你不.order_by(..),它就不能正确地“分组”。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多