diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index ee39f0ec..da0476f7 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -264,6 +264,21 @@ class MIOItemListSimpleSerializer(CustomModelSerializer): model = MIOItem fields = ["id", "mio", "material", "warehouse", "material_name", "warehouse_name", "batch", "count", "test_date", "count_notok"] + +class _MioDetailItemMaterialSerializer(CustomModelSerializer): + class Meta: + model = Material + fields = ["id", "name", "model"] + + +class MIOItemForMioDetailSerializer(CustomModelSerializer): + """MIO 详情下挂的 items 用,仅含前端实际消费的字段""" + material_ = _MioDetailItemMaterialSerializer(source='material', read_only=True) + + class Meta: + model = MIOItem + fields = ["id", "mio", "material", "material_", "batch", "count", "pack_index"] + class MIOItemSerializer(CustomModelSerializer): warehouse_name = serializers.CharField(source='warehouse.name', read_only=True) material_ = MaterialSerializer(source='material', read_only=True) @@ -273,11 +288,33 @@ class MIOItemSerializer(CustomModelSerializer): inout_date = serializers.DateField(source='mio.inout_date', read_only=True) test_user_name = serializers.CharField(source='test_user.name', read_only=True) mioitemw = MIOItemwSerializer(many=True, required=False) + defect = serializers.SerializerMethodField(label="缺陷") + defect_name = serializers.SerializerMethodField(label="缺陷名称") + okcate = serializers.SerializerMethodField(label="缺陷分类") class Meta: model = MIOItem fields = '__all__' - + + def _resolve_defect(self, obj): + if obj.wm_id and obj.wm.defect_id: + return obj.wm.defect + if obj.mb_id and obj.mb.defect_id: + return obj.mb.defect + return None + + def get_defect(self, obj): + d = self._resolve_defect(obj) + return d.id if d else None + + def get_defect_name(self, obj): + d = self._resolve_defect(obj) + return d.name if d else None + + def get_okcate(self, obj): + d = self._resolve_defect(obj) + return d.okcate if d else None + def to_representation(self, instance): ret = super().to_representation(instance) ret["price"] = None @@ -424,7 +461,7 @@ class MIOOtherSerializer(CustomModelSerializer): class MIODetailSerializer(MIOListSerializer): - items = MIOItemSerializer(source='item_mio', many=True, read_only=True) + items = MIOItemForMioDetailSerializer(source='item_mio', many=True, read_only=True) class MIOItemTestSerializer(CustomModelSerializer): diff --git a/apps/inm/views.py b/apps/inm/views.py index a5d35267..ebf966e1 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -7,7 +7,7 @@ from django.conf import settings from rest_framework import serializers from django.utils import timezone from rest_framework.response import Response -from django.db.models import Sum +from django.db.models import Sum, Prefetch from apps.inm.models import WareHouse, MaterialBatch, MIO, MIOItem, MIOItemw, Pack from apps.inm.serializers import ( @@ -153,6 +153,15 @@ class MIOViewSet(CustomModelViewSet): 'item_mio__a_mioitem__batch'] data_filter = True + def get_queryset(self): + queryset = super().get_queryset() + if self.action == 'retrieve': + queryset = queryset.prefetch_related(Prefetch( + 'item_mio', + queryset=MIOItem.objects.select_related('material'), + )) + return queryset + @classmethod def lock_and_check_can_update(cls, mio:MIO): if not connection.in_atomic_block: @@ -346,7 +355,7 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode serializer_class = MIOItemSerializer retrieve_serializer_class = MioItemDetailSerializer create_serializer_class = MIOItemCreateSerializer - select_related_fields = ['warehouse', 'mio', 'material', 'test_user'] + select_related_fields = ['warehouse', 'mio', 'material', 'test_user', 'wm__defect', 'mb__defect'] filterset_fields = { "warehouse": ["exact"], "mio": ["exact"],