perf: mlogb 列表预取 mlogbdefect 与 defect 消除 N+1

将 Mlogb.mlogbdefect 改为反向管理器 self.mlogbdefect_set.all() 以便 prefetch_related 命中缓存;MlogbViewSet 增加对 mlogbdefect_set + defect 的预取。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
caoqianming 2026-04-30 13:47:25 +08:00
parent 46c9eba306
commit 40ebf720f7
2 changed files with 4 additions and 1 deletions

View File

@ -510,7 +510,7 @@ class Mlogb(BaseModel):
@property @property
def mlogbdefect(self): def mlogbdefect(self):
return MlogbDefect.objects.filter(mlogb=self) return self.mlogbdefect_set.all()
def cal_count_pn_jgqbl(self, cal_mlog=False): def cal_count_pn_jgqbl(self, cal_mlog=False):
mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in") mqs = MlogbDefect.get_defect_qs_from_mlogb(self, ftype="in")

View File

@ -765,6 +765,9 @@ class MlogbViewSet(CustomListModelMixin, CustomGenericViewSet):
queryset = Mlogb.objects.all() queryset = Mlogb.objects.all()
serializer_class = MlogbDetailSerializer serializer_class = MlogbDetailSerializer
select_related_fields = ["material_out", "material_in", "test_user", "wm_in__defect"] select_related_fields = ["material_out", "material_in", "test_user", "wm_in__defect"]
prefetch_related_fields = [
Prefetch("mlogbdefect_set", queryset=MlogbDefect.objects.select_related("defect")),
]
filterset_class = MlogbFilter filterset_class = MlogbFilter
ordering = ["create_time"] ordering = ["create_time"]