perf: 优化has_envdata的sql查询

This commit is contained in:
caoqianming 2025-02-13 11:26:27 +08:00
parent 9d27ccd1dc
commit dbbdaa89b9
1 changed files with 4 additions and 9 deletions

View File

@ -79,16 +79,11 @@ class EquipmentViewSet(CustomModelViewSet):
from apps.enp.models import EnvData
from apps.enp.serializers import EnvDataSerializer
# 子查询获取每个 equipment_id 对应的最大时间戳
# 后面可以考虑从缓存里拿
last_time_subquery = EnvData.objects.filter(equipment_id=OuterRef("equipment_id"), timex__gte=now_10_before, timex__lte=now).order_by("-timex").values("timex")[:1]
# 主查询,获取每个 equipment_id 对应的完整记录
last_envdata_qs = EnvData.objects.filter(equipment_id__in=data_ids, timex=Subquery(last_time_subquery))
envdata = EnvDataSerializer(last_envdata_qs, many=True).data
envdata_dict = {item["equipment"]: item for item in envdata}
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}
for item in data:
item["envdata"] = envdata_dict.get(item["id"], {})
item["envdata"] = edata_dict.get(item["id"], {})
return data
@action(methods=["get"], detail=False, perms_map={"get": "*"})