# 优化性能

This commit is contained in:
xianfuxing 2020-08-10 17:22:15 +08:00
parent 1a681a3c67
commit f8945b4d78
1 changed files with 29 additions and 5 deletions

View File

@ -1,3 +1,4 @@
import time
from django.db.models import Q, Min, Max from django.db.models import Q, Min, Max
from django.core.cache import cache from django.core.cache import cache
from rest_framework import serializers from rest_framework import serializers
@ -22,6 +23,28 @@ def get_vol(device_id, cur_vol):
return '{}{}'.format(round(vol, 1), '%') 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): class DeviceCountSerializer(serializers.ModelSerializer):
device_name = serializers.SerializerMethodField() device_name = serializers.SerializerMethodField()
mosq_count = serializers.SerializerMethodField() mosq_count = serializers.SerializerMethodField()
@ -132,7 +155,8 @@ class DeviceInfoSerializer(serializers.ModelSerializer):
def get_count(self, obj): def get_count(self, obj):
try: 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: except IndexError:
self.latest = None self.latest = None
if self.latest: if self.latest:
@ -157,10 +181,10 @@ class DeviceInfoSerializer(serializers.ModelSerializer):
if lon and lat: if lon and lat:
return [lon, lat] return [lon, lat]
query = DeviceCount.objects.filter(~Q(longitude=0), device_id=obj.device_id).order_by('-data_time') # query = DeviceCount.objects.filter(~Q(longitude=0), device_id=obj.device_id).order_by('-data_time')
if query: device = get_device(obj.device_id)
q = query[0] if device:
return [q.longitude, q.latitude] return [device.longitude, device.latitude]
return None return None
def get_time(self, obj): def get_time(self, obj):