perf: 优化has_envdata的sql查询
This commit is contained in:
parent
9d27ccd1dc
commit
dbbdaa89b9
|
@ -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": "*"})
|
||||
|
|
Loading…
Reference in New Issue