From d7361a71df59bbdf5a510d7654b5690f37963023 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 13 Feb 2025 13:26:32 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96has=5Fenvdata?= =?UTF-8?q?=E7=9A=84sql=E6=9F=A5=E8=AF=A22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/em/views.py | 16 +++++++--------- apps/enp/services.py | 27 ++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/apps/em/views.py b/apps/em/views.py index 6b63144b..a280f4a8 100644 --- a/apps/em/views.py +++ b/apps/em/views.py @@ -15,8 +15,8 @@ from django.db import transaction from apps.em.services import daoru_equipment from rest_framework.response import Response from django.conf import settings -from django.db.models import Count, Case, When, IntegerField, Max, OuterRef, Subquery -from datetime import datetime, timedelta +from django.db.models import Count, Case, When, IntegerField +from apps.enp.services import get_last_envdata # Create your views here. @@ -75,13 +75,11 @@ class EquipmentViewSet(CustomModelViewSet): if self.request.query_params.get("has_envdata", "no") == "yes": now = timezone.localtime() now_10_before = now - timezone.timedelta(minutes=10) - data_ids = [item["id"] for item in data] - from apps.enp.models import EnvData - from apps.enp.serializers import EnvDataSerializer - - edata_qs = EnvData.objects.filter(equipment_id__in=data_ids, timex__gte=now_10_before, timex__lte=now).order_by("timex") - edata = EnvDataSerializer(edata_qs, many=True).data - edata_dict = {item["equipment"]: item for item in edata} + edata_dict = {} + if data: + data_ids = [item["id"] for item in data] + edata = get_last_envdata(data_ids, now_10_before, now) + edata_dict = {item["equipment"]: item for item in edata} for item in data: item["envdata"] = edata_dict.get(item["id"], {}) return data diff --git a/apps/enp/services.py b/apps/enp/services.py index 7301287e..59c7b74c 100644 --- a/apps/enp/services.py +++ b/apps/enp/services.py @@ -1 +1,26 @@ -from openpyxl import load_workbook +from apps.enp.models import EnvData +from apps.enp.serializers import EnvDataSerializer +from datetime import datetime + +def get_last_envdata(eIds: list, time_start: datetime, time_end: datetime): + eIds_str = ",".join([f"'{item}'" for item in eIds]) # 将 ID 列表格式化为字符串 + time_start_str = time_start.strftime("%Y-%m-%d %H:%M:%S") + time_end_str = time_end.strftime("%Y-%m-%d %H:%M:%S") + esql = f''' + SELECT DISTINCT ON (equipment_id) * + FROM enp_envdata ee + WHERE equipment_id IN ({eIds_str}) + AND timex AT TIME ZONE 'Asia/Shanghai' >= '{time_start_str}' + AND timex AT TIME ZONE 'Asia/Shanghai' <= '{time_end_str}' + ORDER BY equipment_id, timex DESC + ''' + edata = EnvDataSerializer(EnvData.objects.raw(esql), many=True).data + + # esql ='''SELECT DISTINCT ON (equipment_id) * + # FROM enp_envdata ee + # WHERE equipment_id IN %s + # AND timex AT TIME ZONE 'Asia/Shanghai' >= %s + # AND timex AT TIME ZONE 'Asia/Shanghai' <= %s + # ORDER BY equipment_id, timex DESC''' + # res = query_all_dict(esql, [tuple(data_ids), now_10_before_str, now_str]) + return edata \ No newline at end of file