From 4ddfbb266c482d8dd77d17f0a67868ba8682d897 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 28 Feb 2024 17:20:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20em=E5=8F=AF=E8=BF=94=E5=9B=9Eenvdata?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/em/views.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/em/views.py b/apps/em/views.py index db292e16..122f7df3 100644 --- a/apps/em/views.py +++ b/apps/em/views.py @@ -15,7 +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 +from django.db.models import Count, Case, When, IntegerField, Max, OuterRef, Subquery +from datetime import datetime, timedelta # Create your views here. @@ -76,15 +77,25 @@ class EquipmentViewSet(CustomModelViewSet): def add_info_for_list(self, data): if self.request.query_params.get('has_envdata', 'no') == 'yes': - now = timezone.now() + 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 - last_envdata_qs = EnvData.objects.filter(equipment_id__in=data_ids, time__gte=now_10_before, time__lte=now).values('equipment_id').annotate( - last_time=Max('time')) + # 子查询获取每个 equipment_id 对应的最大时间戳 + last_time_subquery = EnvData.objects.filter( + equipment_id=OuterRef('equipment_id'), + time__gte=now_10_before, + time__lte=now + ).order_by('-time').values('time')[:1] + + # 主查询,获取每个 equipment_id 对应的完整记录 + last_envdata_qs = EnvData.objects.filter( + equipment_id__in=data_ids, + time=Subquery(last_time_subquery) + ) envdata = EnvDataSerializer(last_envdata_qs, many=True).data - envdata_dict = {item['equipment_id']: item for item in envdata} + envdata_dict = {item['equipment']: item for item in envdata} for item in data: item['envdata'] = envdata_dict.get(item['id'], {}) return data