在Django中如何筛选对象并统计用户累计订单总数?
获取用户历史累计订单总数的实现方案
前提假设
假设你的统计模型名为 DailyOrderStats,关联的 CustomUser 模型使用 username 字段存储用户名。
方法一:直接用Django ORM查询
通过分组聚合直接计算每个用户的累计订单总数,再整理成目标格式:
from django.db.models import Sum from .models import DailyOrderStats # 分组求和,获取每个用户的累计订单数 user_order_aggregates = DailyOrderStats.objects.values('name__username') .annotate(total_orders=Sum('orders')) .values('name__username', 'total_orders') # 转换为示例要求的字典格式 result = [ {'name': item['name__username'], 'orders': item['total_orders']} for item in user_order_aggregates ]
逻辑说明:
values('name__username')指定按用户的用户名分组annotate(total_orders=Sum('orders'))对每个分组的orders字段求和- 最后通过列表推导式把查询结果转换成目标结构
方法二:结合Django REST Framework序列化器
如果是在DRF接口中返回该数据,可通过序列化器格式化输出:
1. 定义序列化器
from rest_framework import serializers class UserTotalOrderSerializer(serializers.Serializer): name = serializers.CharField(source='name__username') orders = serializers.IntegerField() class Meta: fields = ('name', 'orders')
2. 编写视图
from rest_framework.views import APIView from rest_framework.response import Response from .models import DailyOrderStats from .serializers import UserTotalOrderSerializer from django.db.models import Sum class UserTotalOrdersView(APIView): def get(self, request): queryset = DailyOrderStats.objects.values('name__username') .annotate(orders=Sum('orders')) .values('name__username', 'orders') serializer = UserTotalOrderSerializer(queryset, many=True) return Response(serializer.data)
访问该视图接口,即可直接得到符合示例格式的JSON响应。
内容的提问来源于stack exchange,提问作者akhil
相关产品推荐
相关产品推荐

