You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何计算每个博客的评论平均词数?

Django中如何计算每个博客的评论平均词数?

嗨,这个问题我之前也碰到过,Django ORM确实没有直接提供“统计词数”的函数,不过我们可以借助数据库的原生函数来实现,下面分两种常用数据库的情况给你方案:

方案一:适用于PostgreSQL数据库

PostgreSQL支持数组和正则表达式操作,我们可以用REGEXP_SPLIT_TO_ARRAY把评论按空格(包括多个连续空格)分割成数组,再用ARRAY_LENGTH获取数组长度(也就是词数),最后用Avg取平均值。

先导入需要的模块:

from django.db.models import Avg, Func, IntegerField, Case, When, Value

然后执行查询:

Blog.objects.annotate(
    # 先计算单条评论的词数,处理空评论的情况
    comment_word_count=Case(
        When(comments__comment__exact='', then=Value(0)),
        default=Func(
            Func('comments__comment', r'\s+', function='REGEXP_SPLIT_TO_ARRAY'),
            1,
            function='ARRAY_LENGTH',
            output_field=IntegerField()
        ),
        output_field=IntegerField()
    ),
    # 再对每个博客的所有评论词数取平均
    avg_comment_word_count=Avg('comment_word_count')
)

方案二:适用于MySQL数据库

MySQL没有数组操作,但可以通过计算空格数量来推导词数:词数 = 总字符数 - 去掉空格后的字符数 + 1,同样要处理空评论的情况。

代码示例:

from django.db.models import Avg, Func, IntegerField, Case, When, Value
Blog.objects.annotate(
    comment_word_count=Case(
        # 空评论直接返回0
        When(comments__comment__exact='', then=Value(0)),
        default=Func(
            'comments__comment',
            Value(' '),
            Value(''),
            function='REPLACE',
            template='LENGTH(%(expressions)s) - LENGTH(%(function)s(%(expressions)s, %(expressions)s[1], %(expressions)s[2])) + 1',
            output_field=IntegerField()
        ),
        output_field=IntegerField()
    ),
    avg_comment_word_count=Avg('comment_word_count')
)

补充说明

  • 上面的方案都是基于“空格分隔单词”的规则,如果你的评论里有标点符号(比如逗号、句号跟着单词),可能需要先清理标点再统计,比如在PostgreSQL里可以先把非字母数字的字符替换掉,再分割。
  • 如果你不想区分数据库,也可以用RawSQL直接写原生SQL查询,但ORM的方式更符合Django的最佳实践。

备注:内容来源于stack exchange,提问作者Gaurab Neupane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:18:01