""" Shipment API 序列化器 """ from rest_framework import serializers from shipment.models import Shipment class ShipmentSerializer(serializers.ModelSerializer): """ 出货单序列化器(只读,用于返回数据) """ customer_name = serializers.CharField(source='customer.name', read_only=True) created_by_id = serializers.IntegerField(source='created_by.id', read_only=True, allow_null=True) created_by_name = serializers.SerializerMethodField() items_count = serializers.SerializerMethodField() class Meta: model = Shipment fields = [ 'id', 'customer', 'customer_name', 'shipment_date', 'remark', 'items_count', 'created_by_id', 'created_by_name', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] def get_created_by_name(self, obj): if obj.created_by: employee = getattr(obj.created_by, 'employee', None) if employee: return employee.name return obj.created_by.username return None def get_items_count(self, obj): return obj.items.count() class ShipmentCreateSerializer(serializers.Serializer): """ 出货单创建序列化器 """ customer = serializers.IntegerField(help_text='客户ID') shipment_date = serializers.DateField(help_text='出货日期') remark = serializers.CharField(required=False, default='', allow_blank=True, help_text='备注') sales_items = serializers.ListField( child=serializers.IntegerField(), required=False, default=list, help_text='要关联的销售品ID列表' ) def validate_sales_items(self, value): # 去重 return list(set(value)) if value else [] class SalesItemSerializer(serializers.Serializer): """ 销售品序列化器(只读) 用于返回销售品数据 """ id = serializers.IntegerField(read_only=True) name = serializers.CharField(read_only=True) quantity = serializers.DecimalField(max_digits=12, decimal_places=2, read_only=True) unit = serializers.IntegerField(read_only=True) unit_display = serializers.SerializerMethodField() position = serializers.CharField(read_only=True) remark = serializers.CharField(read_only=True) printing_job_id = serializers.IntegerField(read_only=True) customer_id = serializers.IntegerField(read_only=True) shipment_id = serializers.IntegerField(source='shipment.id', read_only=True, allow_null=True) shipment_date = serializers.DateField(source='shipment.shipment_date', read_only=True, allow_null=True) created_at = serializers.DateTimeField(read_only=True) created_by_id = serializers.IntegerField(source='created_by.id', read_only=True, allow_null=True) created_by_name = serializers.SerializerMethodField() def get_unit_display(self, obj): return obj.get_unit_display() def get_created_by_name(self, obj): if obj.created_by: employee = getattr(obj.created_by, 'employee', None) if employee: return employee.name return obj.created_by.username return None