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.models import EnvData
|
||||||
from apps.enp.serializers import EnvDataSerializer
|
from apps.enp.serializers import EnvDataSerializer
|
||||||
|
|
||||||
# 子查询获取每个 equipment_id 对应的最大时间戳
|
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
|
||||||
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]
|
edata_dict = {item["equipment"]: item for item in edata}
|
||||||
|
|
||||||
# 主查询,获取每个 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}
|
|
||||||
for item in data:
|
for item in data:
|
||||||
item["envdata"] = envdata_dict.get(item["id"], {})
|
item["envdata"] = edata_dict.get(item["id"], {})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
@action(methods=["get"], detail=False, perms_map={"get": "*"})
|
@action(methods=["get"], detail=False, perms_map={"get": "*"})
|
||||||
|
|
Loading…
Reference in New Issue