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

如何统计并展示各用户类别发送的消息数量(Django实现)

嘿,根据你的模型结构,我整理了两种用Django ORM统计不同用户角色消息发送量的方法,应该能满足你的需求:

方式1:单独统计单个角色的消息数

如果只需要获取某一类角色的消息总量,直接用filter配合count()就很简单:

# 统计买家发送的消息数量
buyer_msg_count = Message.objects.filter(origin_user__is_buyer=True).count()

# 统计卖家发送的消息数量
seller_msg_count = Message.objects.filter(origin_user__is_seller=True).count()

# 统计专业人士发送的消息数量
professional_msg_count = Message.objects.filter(origin_user__is_professional=True).count()

这种方式直观易懂,适合只需要单个角色数据的场景。

方式2:一次性获取所有角色的统计数据

要是想一次查询拿到所有角色的消息统计(减少数据库查询次数),可以用aggregate结合Case/When来实现:

首先得导入对应的ORM工具:

from django.db.models import Count, Case, When, IntegerField

然后执行聚合查询:

role_message_stats = Message.objects.aggregate(
    buyer_count=Count(
        Case(
            When(origin_user__is_buyer=True, then=1),
            output_field=IntegerField()
        )
    ),
    seller_count=Count(
        Case(
            When(origin_user__is_seller=True, then=1),
            output_field=IntegerField()
        )
    ),
    professional_count=Count(
        Case(
            When(origin_user__is_professional=True, then=1),
            output_field=IntegerField()
        )
    )
)

执行后,role_message_stats会是一个包含各角色统计数的字典,示例如下:

{
    'buyer_count': 22,
    'seller_count': 14,
    'professional_count': 7
}

小提醒

  • 如果存在用户同时拥有多个角色(比如既是买家又是卖家),上面的统计会把该用户的消息同时计入对应的多个类别。要是需要互斥统计(一个用户只归属于一个角色),你可能需要调整UserInfo的角色存储方式(比如用带choices的CharField),或者在查询时添加互斥条件。
  • 要是想在admin后台展示这些统计,可以把上述查询逻辑放到admin类的get_context_data方法里,把统计结果加入上下文字典,之后就能在模板里渲染展示啦。

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:52:32