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

如何格式化字段名并对数值取整?Django员工销售查询优化

解决Django查询中字段重命名与数值取整问题

要实现你需要的效果,只需对原查询做三处关键修改:

  • 给关联字段重命名为employee_id
  • 对发票总金额的求和结果进行取整
  • 限制结果仅返回Top3员工

首先确保导入所需的模型函数:

from django.db.models import Sum, F, Round

修改后的完整代码如下:

class CustomerViewSet(viewsets.ReadOnlyModelViewSet):

    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

    @action(detail=False, methods=['get'])
    def top_three_employees(self, request):
        total_sells_by_employees = Invoice.objects \
            .select_related('customerid__supportrepid')  # 合并嵌套关联查询,写法更简洁
            .values(employee_id=F('customerid__supportrepid__id'))  # 重命名字段为employee_id
            .annotate(sells=Round(Sum('total')))  # 对求和结果做四舍五入取整
            .order_by('-sells')[:3]  # 仅取排名前三的结果

        return Response(total_sells_by_employees)

改动细节说明:

  1. 字段重命名:通过values(employee_id=F('customerid__supportrepid__id')),用F()表达式引用原关联字段,并赋予新的别名employee_id,直接在数据库查询阶段完成字段名替换。
  2. 数值取整:使用Round(Sum('total'))对总金额求和结果做四舍五入取整;如果需要直接截断小数(只保留整数部分),可以改用Cast(Sum('total'), IntegerField())(需额外导入Cast和IntegerField)。
  3. Top3限制:在查询集末尾添加[:3],直接从数据库层面限制返回数量,比在内存中过滤更高效。
  4. 关联查询优化:将两层嵌套的select_related合并为一个,写法更简洁,查询性能不受影响。

修改后返回的数据格式会符合预期:

[
    {
        "employee_id": 3,
        "sells": 833
    },
    ...
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:35:56