From b3d0b347195a09c1022522a7b6f63eaf7169d270 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 27 Mar 2026 14:40:07 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=20Material=20?= =?UTF-8?q?=E5=8F=AF=E7=94=A8=E7=89=A9=E6=96=99=E8=BF=87=E6=BB=A4=EF=BC=8C?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=20DB=20=E5=AD=90=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 filter_process_todo 过滤器替代原 todo tag 逻辑 - 避免将 ID 列表加载到 Python 内存,改用两个子查询 OR 合并 Co-Authored-By: Claude Sonnet 4.6 --- apps/mtm/filters.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/mtm/filters.py b/apps/mtm/filters.py index 08d67141..76c89920 100644 --- a/apps/mtm/filters.py +++ b/apps/mtm/filters.py @@ -1,12 +1,13 @@ from django_filters import rest_framework as filters -from apps.mtm.models import Goal, Material, Route, RoutePack +from apps.mtm.models import Goal, Material, Route, RouteMat, RoutePack, Process from django.db.models.expressions import F from rest_framework.exceptions import ParseError from django.db.models import Sum, Q, Value, F, ExpressionWrapper, DecimalField from django.db.models.functions import Coalesce class MaterialFilter(filters.FilterSet): - tag = filters.CharFilter(method='filter_tag', label="low_inm:库存不足") + tag = filters.CharFilter(method='filter_tag', label="low_inm:库存不足;todo:可用") + process_todo = filters.CharFilter(method='filter_process_todo', label="process_todo:待处理") class Meta: model = Material @@ -25,6 +26,14 @@ class MaterialFilter(filters.FilterSet): "route_material_out__mgroup": ["exact"], "count_safe": ["gte", "lte", "exact", "gt", "lt"] } + + def filter_process_todo(self, queryset, name, value): + if value: + queryset = queryset.filter( + Q(id__in=RouteMat.objects.filter(route__process__id=value).values('material_id')) | + Q(id__in=Route.objects.filter(process__id=value).values('material_in_id')) + ) + return queryset def filter_tag(self, queryset, name, value): if value == 'low_inm':