from rest_framework import serializers from .models import BoundListModel, BoundDetailModel, BoundBatchModel from utils import datasolve class BoundListGetSerializer(serializers.ModelSerializer): # 定义主单列表的序列化器,用于获取操作,字段只读 bound_month = serializers.CharField(read_only=True, required=False) bound_date = serializers.DateField(read_only=True, format='%Y-%m-%d') bound_code = serializers.CharField(read_only=True, required=False) bound_code_type = serializers.CharField(read_only=True, required=False) bound_bs_type = serializers.CharField(read_only=True, required=False) bound_type = serializers.CharField(read_only=True, required=False) bound_desc = serializers.CharField(read_only=True, required=False) bound_department = serializers.CharField(read_only=True, required=False) bound_status = serializers.CharField(read_only=True, required=False) creater = serializers.CharField(read_only=True, required=False) create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') class Meta: # 指定模型和排除字段 model = BoundListModel exclude = ['openid', 'is_delete'] read_only_fields = ['id', 'openid'] class BoundListPostSerializer(serializers.ModelSerializer): # 定义主单列表的序列化器,用于创建操作,允许部分字段写入 bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) bound_date = serializers.DateField(read_only=False, required=False, validators=[datasolve.data_validate]) bound_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) bound_code_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) bound_bs_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) bound_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) bound_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) bound_department = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) bound_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) is_delete = serializers.BooleanField(read_only=False, required=False) class Meta: # 指定模型和排除字段 model = BoundListModel fields= '__all__' read_only_fields = ['id', 'create_time', 'update_time'] class BoundBatchGetSerializer(serializers.ModelSerializer): # 定义批次列表的序列化器,用于获取操作,字段只读 bound_number = serializers.CharField(read_only=True, required=False) bound_month = serializers.CharField(read_only=True, required=False) warehouse_code = serializers.CharField(read_only=True, required=False) warehouse_name = serializers.CharField(read_only=True, required=False) goods_code = serializers.CharField(read_only=True, required=False) goods_desc = serializers.CharField(read_only=True, required=False) goods_qty = serializers.IntegerField(read_only=True, required=False) goods_weight = serializers.FloatField(read_only=True, required=False) goods_total_weight = serializers.FloatField(read_only=True, required=False) creater = serializers.CharField(read_only=True, required=False) create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S') class Meta: # 指定模型和排除字段 model = BoundBatchModel exclude = ['openid', 'is_delete'] read_only_fields = ['id', 'openid'] class BoundBatchPostSerializer(serializers.ModelSerializer): # 定义批次列表的序列化器,用于创建操作,允许部分字段写入 bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate]) goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate]) goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate]) openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate]) creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate]) is_delete = serializers.BooleanField(read_only=False, required=False) class Meta: # 指定模型和排除字段 model = BoundBatchModel fields= '__all__' read_only_fields = ['id', 'create_time', 'update_time'] extra_kwargs = { 'is_delete': { 'default': False, 'help_text': "逻辑删除标记(默认False)" } } class BoundDetailGetSerializer(serializers.ModelSerializer): # 嵌套展示关联的主单和批次信息 bound_list = serializers.SerializerMethodField() bound_batch = serializers.SerializerMethodField() detail_code = serializers.CharField(read_only=True, required=False) # 定义其他字段,只读 creater = serializers.CharField(source='creater.username', read_only=True) create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S') update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S') class Meta: # 指定模型和字段,所有字段只读 model = BoundDetailModel fields = [ 'id', 'bound_list', 'bound_batch', 'detail_code', 'creater', 'create_time', 'update_time', 'is_delete' ] read_only_fields = ['__all__'] def get_bound_list(self, obj): """ 动态序列化关联的主单数据 """ from .serializers import BoundListGetSerializer # 延迟导入避免循环引用 return BoundListGetSerializer(obj.bound_list).data def get_bound_batch(self, obj): """ 动态序列化关联的批次数据 """ from .serializers import BoundBatchGetSerializer return BoundBatchGetSerializer(obj.bound_batch).data class BoundDetailPostSerializer(serializers.ModelSerializer): # 使用主键ID关联主单和批次 bound_list = serializers.PrimaryKeyRelatedField( queryset=BoundListModel.objects.all(), help_text="关联主单ID(必须已存在)", error_messages={ 'does_not_exist': "指定主单不存在", 'incorrect_type': "主单ID格式错误" } ) bound_batch = serializers.PrimaryKeyRelatedField( queryset=BoundBatchModel.objects.all(), help_text="关联批次ID(必须已存在)", error_messages={ 'does_not_exist': "指定批次不存在", 'incorrect_type': "批次ID格式错误" } ) # 创建人字段,必须填写 creater = serializers.CharField( required=True, max_length=255, help_text="创建人标识(建议从用户系统获取)", error_messages={ 'blank': "创建人不能为空", 'max_length': "最长255个字符" } ) detail_code = serializers.CharField(read_only=False, required=False) class Meta: # 指定模型和字段,部分字段只读 model = BoundDetailModel fields='__all__' read_only_fields = [ 'id', 'create_time', 'update_time', 'is_delete' ] extra_kwargs = { 'is_delete': { 'default': False, 'help_text': "逻辑删除标记(默认False)" } }