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
相关产品推荐
相关产品推荐

