Merge pull request 'feat: mioitem 返回 defect/defect_name/okcate 并优化 mio 详情 items 序列化' (#4) from dev_cqm into master

Reviewed-on: http://gitea.xxhhcty.xyz:8080/zcdsj/factory/pulls/4
This commit is contained in:
caoqianming 2026-05-12 09:28:25 +08:00
commit 4d60c2c7bd
2 changed files with 50 additions and 4 deletions

View File

@ -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):

View File

@ -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"],