serializers.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. from rest_framework import serializers
  2. from .models import BoundListModel, BoundDetailModel, BoundBatchModel
  3. from utils import datasolve
  4. class BoundListGetSerializer(serializers.ModelSerializer):
  5. # 定义主单列表的序列化器,用于获取操作,字段只读
  6. bound_month = serializers.CharField(read_only=True, required=False)
  7. bound_date = serializers.DateField(read_only=True, format='%Y-%m-%d')
  8. bound_code = serializers.CharField(read_only=True, required=False)
  9. bound_code_type = serializers.CharField(read_only=True, required=False)
  10. bound_bs_type = serializers.CharField(read_only=True, required=False)
  11. bound_type = serializers.CharField(read_only=True, required=False)
  12. bound_desc = serializers.CharField(read_only=True, required=False)
  13. bound_department = serializers.CharField(read_only=True, required=False)
  14. bound_status = serializers.CharField(read_only=True, required=False)
  15. creater = serializers.CharField(read_only=True, required=False)
  16. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  17. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  18. class Meta:
  19. # 指定模型和排除字段
  20. model = BoundListModel
  21. exclude = ['openid', 'is_delete']
  22. read_only_fields = ['id', 'openid']
  23. class BoundListPostSerializer(serializers.ModelSerializer):
  24. # 定义主单列表的序列化器,用于创建操作,允许部分字段写入
  25. bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  26. bound_date = serializers.DateField(read_only=False, required=False, validators=[datasolve.data_validate])
  27. bound_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  28. bound_code_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  29. bound_bs_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  30. bound_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  31. bound_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  32. bound_department = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  33. bound_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  34. openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  35. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  36. is_delete = serializers.BooleanField(read_only=False, required=False)
  37. class Meta:
  38. # 指定模型和排除字段
  39. model = BoundListModel
  40. fields= '__all__'
  41. read_only_fields = ['id', 'create_time', 'update_time']
  42. class BoundBatchGetSerializer(serializers.ModelSerializer):
  43. # 定义批次列表的序列化器,用于获取操作,字段只读
  44. bound_number = serializers.CharField(read_only=True, required=False)
  45. bound_month = serializers.CharField(read_only=True, required=False)
  46. warehouse_code = serializers.CharField(read_only=True, required=False)
  47. warehouse_name = serializers.CharField(read_only=True, required=False)
  48. goods_code = serializers.CharField(read_only=True, required=False)
  49. goods_desc = serializers.CharField(read_only=True, required=False)
  50. goods_qty = serializers.IntegerField(read_only=True, required=False)
  51. goods_in_qty = serializers.IntegerField(read_only=True, required=False)
  52. goods_out_qty = serializers.IntegerField(read_only=True, required=False)
  53. status = serializers.IntegerField(read_only=True, required=False)
  54. goods_weight = serializers.FloatField(read_only=True, required=False)
  55. goods_total_weight = serializers.FloatField(read_only=True, required=False)
  56. creater = serializers.CharField(read_only=True, required=False)
  57. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  58. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  59. class Meta:
  60. # 指定模型和排除字段
  61. model = BoundBatchModel
  62. exclude = ['openid', 'is_delete']
  63. read_only_fields = ['id', 'openid']
  64. class BoundBatchPostSerializer(serializers.ModelSerializer):
  65. # 定义批次列表的序列化器,用于创建操作,允许部分字段写入
  66. bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  67. bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  68. warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  69. warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  70. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  71. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  72. goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  73. goods_in_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  74. goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  75. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  76. goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate])
  77. goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate])
  78. openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  79. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  80. is_delete = serializers.BooleanField(read_only=False, required=False)
  81. class Meta:
  82. # 指定模型和排除字段
  83. model = BoundBatchModel
  84. fields= '__all__'
  85. read_only_fields = ['id', 'create_time', 'update_time']
  86. extra_kwargs = {
  87. 'is_delete': {
  88. 'default': False,
  89. 'help_text': "逻辑删除标记(默认False)"
  90. }
  91. }
  92. class BoundDetailGetSerializer(serializers.ModelSerializer):
  93. # 嵌套展示关联的主单和批次信息
  94. bound_list = serializers.SerializerMethodField()
  95. bound_batch = serializers.SerializerMethodField()
  96. detail_code = serializers.CharField(read_only=True, required=False)
  97. status = serializers.IntegerField(read_only=False, required=False)
  98. # 定义其他字段,只读
  99. creater = serializers.CharField(source='creater.username', read_only=True)
  100. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  101. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  102. class Meta:
  103. # 指定模型和字段,所有字段只读
  104. model = BoundDetailModel
  105. fields = [
  106. 'id',
  107. 'bound_list',
  108. 'bound_batch',
  109. 'detail_code',
  110. 'creater',
  111. 'create_time',
  112. 'update_time',
  113. 'is_delete',
  114. 'status'
  115. ]
  116. read_only_fields = ['__all__']
  117. def get_bound_list(self, obj):
  118. """ 动态序列化关联的主单数据 """
  119. from .serializers import BoundListGetSerializer # 延迟导入避免循环引用
  120. return BoundListGetSerializer(obj.bound_list).data
  121. def get_bound_batch(self, obj):
  122. """ 动态序列化关联的批次数据 """
  123. from .serializers import BoundBatchGetSerializer
  124. return BoundBatchGetSerializer(obj.bound_batch).data
  125. class BoundDetailPostSerializer(serializers.ModelSerializer):
  126. # 使用主键ID关联主单和批次
  127. bound_list = serializers.PrimaryKeyRelatedField(
  128. queryset=BoundListModel.objects.all(),
  129. help_text="关联主单ID(必须已存在)",
  130. error_messages={
  131. 'does_not_exist': "指定主单不存在",
  132. 'incorrect_type': "主单ID格式错误"
  133. }
  134. )
  135. bound_batch = serializers.PrimaryKeyRelatedField(
  136. queryset=BoundBatchModel.objects.all(),
  137. help_text="关联批次ID(必须已存在)",
  138. error_messages={
  139. 'does_not_exist': "指定批次不存在",
  140. 'incorrect_type': "批次ID格式错误"
  141. }
  142. )
  143. # 创建人字段,必须填写
  144. creater = serializers.CharField(
  145. required=True,
  146. max_length=255,
  147. help_text="创建人标识(建议从用户系统获取)",
  148. error_messages={
  149. 'blank': "创建人不能为空",
  150. 'max_length': "最长255个字符"
  151. }
  152. )
  153. detail_code = serializers.CharField(read_only=False, required=False)
  154. status = serializers.IntegerField(read_only=False, required=False)
  155. class Meta:
  156. # 指定模型和字段,部分字段只读
  157. model = BoundDetailModel
  158. fields='__all__'
  159. read_only_fields = [
  160. 'id',
  161. 'create_time',
  162. 'update_time',
  163. 'is_delete'
  164. ]
  165. extra_kwargs = {
  166. 'is_delete': {
  167. 'default': False,
  168. 'help_text': "逻辑删除标记(默认False)"
  169. }
  170. }