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

Django基于外键统计模型对象数量并适配序列化器的实现方法

实现方案

第一步:ORM分组统计查询

使用Django原生的聚合查询能力即可实现按作者分组统计,无需手写SQL:
首先导入需要的工具:

from django.db.models import Count, F

执行分组统计查询:

# 直接返回符合要求格式的可迭代QuerySet,元素为字典
stat_list = Model1.objects.annotate(
    userid=F('author_id')
).values('userid').annotate(
    noofposts=Count('id')
).order_by()

说明:

  • 用F('author_id')将外键字段重命名为要求的userid,如果不需要修改键名可以省略这一步,直接取author_id作为键
  • values指定分组字段,对应SQL的GROUP BY逻辑
  • Count('id')统计每个分组下的Model1记录总数
  • 末尾加空的order_by()是为了清除模型默认排序字段对分组结果的干扰,如果需要按统计结果排序可以改为order_by('-noofposts')实现按发布量倒序

第二步:DRF序列化器适配

因为返回的是字典格式的QuerySet,不需要绑定模型,直接定义普通Serializer即可:

from rest_framework import serializers

class Model1StatSerializer(serializers.Serializer):
    userid = serializers.IntegerField()
    noofposts = serializers.IntegerField()

视图调用示例

from rest_framework.response import Response
from rest_framework.views import APIView

class AuthorPostStatView(APIView):
    def get(self, request):
        stat_list = Model1.objects.annotate(
            userid=F('author_id')
        ).values('userid').annotate(
            noofposts=Count('id')
        ).order_by('-noofposts')
        serializer = Model1StatSerializer(stat_list, many=True)
        return Response(serializer.data)

返回结果完全匹配你给出的示例格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:03