普拉多VX

人生一路,不问来时,不知归期

0%

Django ORM 根据小时 天聚合查询数据

需求说明

根据数据库中的创建时间来根据小时、天统计平均在线的设备数量

实现

在视图中方法中导入connection模块

views.py

1
2
from django.db import connection
from django.db.models import Sum,Count,Avg

参考用法
具体使用的方法为,其他方法用法可参考源码文件

  • date_trunc_sql
  • datetime_trunc_sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class PoolWorkersCharView(generics.GenericAPIView):
"""
获取矿池在线矿机数据,可根据计划任务进行调整和统计
"""
pagination_class = (IsAuthenticated,)

def get(self, request):
dimension = request.GET.get('dimension','1h')
num_size = request.GET.get("size", 24)

if dimension == '1h':
# 根据小时获取平均在线矿工数
select = {'hour': connection.ops.datetime_trunc_sql('hour', 'created_at',settings.TIME_ZONE)}
workers_data = StatsPoolMinerWorkers.objects.filter(coin='eth').extra(select=select).values(
'hour').annotate(sum=Avg('workers'))
ser_worker_dict = PoolWorkersHourSerializer(workers_data, many=True)
else:
# 根据天获取平均在线矿机数
select = {'day': connection.ops.date_trunc_sql('day', 'created_at')}
workers_data = StatsPoolMinerWorkers.objects.filter(coin='eth').extra(select=select).values(
'day').annotate(sum=Avg('workers'))

ser_worker_dict = PoolWorkersDaySerializer(workers_data, many=True)

return_data = ser_worker_dict.data[:num_size]
return Response({'workers':return_data,'count':len(return_data)})

参考