通过django的values_list和annotate实现group by功能

lnglat_set = LngLat.objects.all()
heatmapdict = {}
lnglat = lnglat_set.first()
lnglat
<LngLat: 126.03407000000,42.028320000000>
celldatausage_set = CellDataUsage.objects.filter(cell__lnglat=lnglat)
celldatausage_set
<QuerySet [<CellDataUsage: CellDataUsage object (41231)>, <CellDataUsage: CellDataUsage object (41232)>, <CellDataUsage: CellDataUsage object (41233)>, <CellDataUsage: CellDataUsage object (41234)>, <CellDataUsage: CellDataUsage object (41235)>, <CellDataUsage: CellDataUsage object (41236)>, <CellDataUsage: CellDataUsage object (41237)>, <CellDataUsage: CellDataUsage object (41238)>, <CellDataUsage: CellDataUsage object (41239)>, <CellDataUsage: CellDataUsage object (41240)>, <CellDataUsage: CellDataUsage object (41241)>, <CellDataUsage: CellDataUsage object (41242)>, <CellDataUsage: CellDataUsage object (41243)>, <CellDataUsage: CellDataUsage object (41244)>, <CellDataUsage: CellDataUsage object (41245)>, <CellDataUsage: CellDataUsage object (41246)>, <CellDataUsage: CellDataUsage object (41247)>, <CellDataUsage: CellDataUsage object (41248)>, <CellDataUsage: CellDataUsage object (41249)>, <CellDataUsage: CellDataUsage object (41250)>, '...(remaining elements truncated)...']>
# 注意看,重点在这里:
# Sum求和,是同一个开始时间(begin)的所有数据的和
# annotate本来是注释的意思,但是这个函数也可以用于聚合
sumusage = celldatausage_set.values_list('begin').annotate(Sum('up'), Sum('down'))
sumusage
# 所得结果中,第一个值(1、2、3...)是开始时间的id,
# 后两个值是该时间段上行流量总和 和 下行流量总和
<QuerySet [(1, 1775.416015625, 21632.48046875), (2, 1567.0537109375, 17847.103515625), (3, 1613.912109375, 21129.3203125), (4, 1949.53125, 23045.0654296875), (5, 1243.3408203125, 15595.7431640625), (6, 2449.9287109375, 27001.8466796875), (7, 2535.240234375, 39095.0068359375)]>
eachday = sumusage.first()
eachday
(1, 1138.3828125, 15016.919921875)
updown = eachday[1] + eachday[2]
updown
16155.302734375
begin = Begin.objects.filter(id=eachday[0]).first().strftime('%Y-%m-%d')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'Begin' object has no attribute 'strftime'
begin = Begin.objects.filter(id=eachday[0]).first().begin.strftime('%Y-%m-%d')
begin
'2017-09-18'
onedict = {"lng": float(lnglat.lng), "lat": float(lnglat.lat), "count": updown}
onedict
{'lng': 126.03407, 'lat': 42.02832, 'count': 16155.302734375}
begin in heatmapdict
False
heatmapdict[begin] = [onedict]
heatmapdict
{'2017-09-18': [{'lng': 126.03407, 'lat': 42.02832, 'count': 16155.302734375}]}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值