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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:17:13