diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index a1a6a6e6..3f8fdce5 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -247,6 +247,15 @@ class MIOItemAListSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS_BASE +class MIOItemListSimpleSerializer(CustomModelSerializer): + warehouse_name = serializers.CharField(source='warehouse.name', read_only=True) + material_name = serializers.StringRelatedField( + source='material', read_only=True) + + class Meta: + model = MIOItem + fields = ["id", "mio", "material", "warehouse", "material_name", "warehouse_name", "batch", "count", "test_date", "count_notok"] + class MIOItemSerializer(CustomModelSerializer): warehouse_name = serializers.CharField(source='warehouse.name', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) diff --git a/apps/inm/views.py b/apps/inm/views.py index e1a3c988..a5d35267 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -14,7 +14,7 @@ from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, MioItemAnaSerializer, MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer, - MIOItemwSerializer, MioItemDetailSerializer, PackSerializer, PackMioSerializer) + MIOItemwSerializer, MioItemDetailSerializer, PackSerializer, PackMioSerializer, MIOItemListSimpleSerializer) from apps.inm.serializers2 import MIOItemwCreateUpdateSerializer from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService @@ -163,20 +163,39 @@ class MIOViewSet(CustomModelViewSet): return mio def add_info_for_list(self, data): - # 获取检验状态 - mio_dict = {} + # 1. 收集所有mio的ID + mio_ids = [item['id'] for item in data] + + # 2. 预初始化mio字典和items列表 + mio_dict = {item['id']: { + **item, + 'is_tested': False, # 默认值设为False + 'mioitems': [] + } for item in data} + + # 3. 批量查询MIOItem数据 + if mio_ids: # 避免空查询 + mioitems = MIOItemListSimpleSerializer( + instance=MIOItem.objects.filter( + mio__id__in=mio_ids + ).select_related("warehouse", "material"), + many=True + ).data + + # 4. 单次循环处理所有item + for item in mioitems: + mio_id = item['mio'] + if mio_id in mio_dict: + mio_dict[mio_id]['mioitems'].append(item) + # 更新is_tested状态(只要有一个item有test_date就为True) + if item.get('test_date'): + mio_dict[mio_id]['is_tested'] = True + + # 5. 直接返回原始data列表,避免额外转换 for item in data: - item['is_tested'] = None - mio_dict[item['id']] = item - mioitems = list(MIOItem.objects.filter(mio__id__in=mio_dict.keys()).values_list("mio__id", "test_date")) - for item in mioitems: - mioId, test_date = item - is_tested = False - if test_date: - is_tested = True - mio_dict[mioId]['is_tested'] = is_tested - datax = [mio_dict[key] for key in mio_dict.keys()] - return datax + item.update(mio_dict[item['id']]) + + return data def get_serializer_class(self): if self.action in ['create', 'update', 'partial_update']: