如何格式化字段名并对数值取整?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)
改动细节说明:
- 字段重命名:通过
values(employee_id=F('customerid__supportrepid__id')),用F()表达式引用原关联字段,并赋予新的别名employee_id,直接在数据库查询阶段完成字段名替换。 - 数值取整:使用
Round(Sum('total'))对总金额求和结果做四舍五入取整;如果需要直接截断小数(只保留整数部分),可以改用Cast(Sum('total'), IntegerField())(需额外导入Cast和IntegerField)。 - Top3限制:在查询集末尾添加
[:3],直接从数据库层面限制返回数量,比在内存中过滤更高效。 - 关联查询优化:将两层嵌套的
select_related合并为一个,写法更简洁,查询性能不受影响。
修改后返回的数据格式会符合预期:
[ { "employee_id": 3, "sells": 833 }, ... ]
内容的提问来源于stack exchange,提问作者kubaSpolsky
相关产品推荐
相关产品推荐

