From 683bca5688d8fae4b08399171795e712be5c3483 Mon Sep 17 00:00:00 2001 From: xianfuxing Date: Mon, 17 Sep 2018 21:45:25 +0800 Subject: [PATCH] # imporved tasks --- apps/mosquito/tasks.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/mosquito/tasks.py b/apps/mosquito/tasks.py index d6b2e05..72e6d05 100644 --- a/apps/mosquito/tasks.py +++ b/apps/mosquito/tasks.py @@ -33,15 +33,15 @@ def fill_date(ret=None, tz=None): return ret -def get_daily_statistic(SPLIT_BY_DEVICE=False): +def get_daily_statistic(enable_container=False): + device_container = {} + daily_ret = {} queryset = DeviceCount.objects.raw('select id, date(data_time) as date from device_count group by date') if queryset: - calc_result = {} tz = pytz.timezone("UTC") device_list = {item.device_id for item in DeviceCount.objects.distinct()} for item in device_list: - calc_result[item] = [] - ret = {} + device_container[item] = set() for q in queryset: # 按照 device_id 分组查询最新时间 max_time,然后通过id + max_time 获取实例,用来得到count midnight = tz.localize(datetime.combine(q.date, time(23, 59)), is_dst=None) @@ -50,22 +50,22 @@ def get_daily_statistic(SPLIT_BY_DEVICE=False): 'device_id').annotate(max_time=Max('data_time'))] if daily_queryset: daily_queryset = [reduce(max_count, entry) if len(entry) > 1 else entry[0] for entry in daily_queryset] - if SPLIT_BY_DEVICE: + if enable_container: for device_id in device_list: - calc_result[device_id] += [entry for entry in daily_queryset if entry.device_id == device_id] - else: - calc_result = sum(map(lambda x: int(x.count), daily_queryset)) + device_container[device_id] = device_container[device_id] | \ + {(entry.count, entry.data_time) + for entry in daily_queryset if entry.device_id == device_id} + calc_result = sum(map(lambda x: int(x.count), daily_queryset)) date = q.date - ret[date] = calc_result + daily_ret[date] = calc_result + return daily_ret, device_container - return ret - return None -@task() def update_daily_statistic(): full_ret = None # 计算每天聚合值 - daily_ret = get_daily_statistic() + daily_ret, device_container = get_daily_statistic(enable_container=True) + for k in device_container: print(k, device_container[k]) # 计算没有记录的日期,值 if daily_ret: @@ -88,7 +88,7 @@ def update_daily_statistic(): else: MosqPostStatistic.objects.create(date=d, total=full_ret[d], increment=full_ret[d]) else: - increment = full_ret[d] - full_ret[d-timedelta(days=1)] + increment = full_ret[d] - full_ret[d - timedelta(days=1)] if obj: obj.total, obj.increment = full_ret[d], increment obj.save()