Django新手求助:如何按stock_id分组统计open_price与quantity之和
按股票汇总交易数据的Django查询方案
嘿,作为Django新手,刚接触模型聚合查询确实容易踩坑,我来帮你搞定这个按股票汇总交易数据的需求!
首先,假设你的Trades模型里有和Stock关联的外键(比如名为stock)、open_price(开仓价格)和quantity(持仓数量)字段——如果你的字段名不一样,记得替换成自己的实际字段名哦。
核心查询语句
你需要用到Django ORM的values()和annotate()方法,配合Sum聚合函数来实现分组求和:
from django.db.models import Sum # 基础版:按stock_id分组,计算每个股票的总开仓价格和总持仓量 trade_summary = Trades.objects.values('stock_id').annotate( total_open_price=Sum('open_price'), total_quantity=Sum('quantity') ).order_by('stock_id')
进阶:同时获取股票的其他信息
如果想在结果里同时显示股票名称这类Stock模型的字段,可以调整values()里的参数,关联Stock的字段:
# 进阶版:包含股票名称的汇总结果 trade_summary = Trades.objects.values('stock__id', 'stock__name').annotate( total_open_price=Sum('open_price'), total_quantity=Sum('quantity') ).order_by('stock__id')
如何使用查询结果
你可以通过遍历trade_summary来获取每个分组的数据:
# 遍历基础版结果 for item in trade_summary: print(f"股票ID: {item['stock_id']}, 总持仓量: {item['total_quantity']}, 总开仓金额: {item['total_open_price']}") # 遍历进阶版结果 for item in trade_summary: print(f"股票ID: {item['stock__id']}, 股票名称: {item['stock__name']}, 总持仓量: {item['total_quantity']}, 总开仓金额: {item['total_open_price']}")
关键知识点解释
values('stock_id'):告诉Django要按stock_id字段进行分组;annotate(Sum('字段名')):对每个分组内的指定字段求和,并给结果起一个自定义的键名(比如total_open_price);order_by():可选,用来让结果按股票ID排序,方便查看。
如果你的模型字段名和我假设的不一样(比如外键字段叫stock_id而不是stock),只需要把stock_id或者stock__id替换成你实际的字段名就可以啦!
内容的提问来源于stack exchange,提问作者Sharpless512
相关产品推荐
相关产品推荐

