From f8945b4d78b572cd2482c79f87b01efa5065a36f Mon Sep 17 00:00:00 2001 From: xianfuxing Date: Mon, 10 Aug 2020 17:22:15 +0800 Subject: [PATCH] =?UTF-8?q?#=20=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/counter/api/serializers.py | 34 ++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/counter/api/serializers.py b/apps/counter/api/serializers.py index ba5aae7..3c42bbf 100644 --- a/apps/counter/api/serializers.py +++ b/apps/counter/api/serializers.py @@ -1,3 +1,4 @@ +import time from django.db.models import Q, Min, Max from django.core.cache import cache from rest_framework import serializers @@ -22,6 +23,28 @@ def get_vol(device_id, cur_vol): return '{}{}'.format(round(vol, 1), '%') +def get_latest(device_id): + latest_key = 'device_latest_{}'.format(device_id) + latest = cache.get(latest_key) + if not latest: + latest = DeviceCount.objects.filter(device_id=device_id).order_by('-data_time')[0] + cache.set(latest_key, latest, 60 * 10) + return latest + + +def get_device(device_id): + device_key = 'device_lon_{}'.format(device_id) + device = cache.get(device_key) + if not device: + qs = DeviceCount.objects.filter(~Q(longitude=0), device_id=device_id).order_by('-data_time') + if qs.count() > 0: + device = qs.first() + cache.set(device_key, device, 60 * 10) + else: + return None + return device + + class DeviceCountSerializer(serializers.ModelSerializer): device_name = serializers.SerializerMethodField() mosq_count = serializers.SerializerMethodField() @@ -132,7 +155,8 @@ class DeviceInfoSerializer(serializers.ModelSerializer): def get_count(self, obj): try: - self.latest = DeviceCount.objects.filter(device_id=obj.device_id).order_by('-data_time')[0] + # self.latest = DeviceCount.objects.filter(device_id=obj.device_id).order_by('-data_time')[0] + self.latest = get_latest(obj.device_id) except IndexError: self.latest = None if self.latest: @@ -157,10 +181,10 @@ class DeviceInfoSerializer(serializers.ModelSerializer): if lon and lat: return [lon, lat] - query = DeviceCount.objects.filter(~Q(longitude=0), device_id=obj.device_id).order_by('-data_time') - if query: - q = query[0] - return [q.longitude, q.latitude] + # query = DeviceCount.objects.filter(~Q(longitude=0), device_id=obj.device_id).order_by('-data_time') + device = get_device(obj.device_id) + if device: + return [device.longitude, device.latitude] return None def get_time(self, obj):