serializers.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. from rest_framework import serializers
  2. from .models import BoundListModel, BoundDetailModel, BoundBatchModel,OutBatchModel,BatchLogModel,OutBoundDetailModel
  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_std = serializers.CharField(read_only=True, required=False)
  51. goods_qty = serializers.IntegerField(read_only=True, required=False)
  52. goods_in_qty = serializers.IntegerField(read_only=True, required=False)
  53. goods_out_qty = serializers.IntegerField(read_only=True, required=False)
  54. status = serializers.IntegerField(read_only=True, required=False)
  55. goods_weight = serializers.FloatField(read_only=True, required=False)
  56. goods_total_weight = serializers.FloatField(read_only=True, required=False)
  57. creater = serializers.CharField(read_only=True, required=False)
  58. create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  59. update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')
  60. class Meta:
  61. # 指定模型和排除字段
  62. model = BoundBatchModel
  63. exclude = ['openid', 'is_delete']
  64. read_only_fields = ['id', 'openid']
  65. class BoundBatchPostSerializer(serializers.ModelSerializer):
  66. # 定义批次列表的序列化器,用于创建操作,允许部分字段写入
  67. bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  68. bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  69. bound_batch_order = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  70. warehouse_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  71. warehouse_name = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  72. goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  73. goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  74. goods_std = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  75. goods_qty = serializers.IntegerField(read_only=False, required=True, validators=[datasolve.data_validate])
  76. goods_in_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  77. goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  78. status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  79. goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate])
  80. goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate])
  81. openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  82. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  83. is_delete = serializers.BooleanField(read_only=False, required=False)
  84. class Meta:
  85. # 指定模型和排除字段
  86. model = BoundBatchModel
  87. fields= '__all__'
  88. read_only_fields = ['id', 'create_time', 'update_time']
  89. extra_kwargs = {
  90. 'is_delete': {
  91. 'default': False,
  92. 'help_text': "逻辑删除标记(默认False)"
  93. }
  94. }
  95. class BoundDetailGetSerializer(serializers.ModelSerializer):
  96. # 嵌套展示关联的主单和批次信息
  97. bound_list = serializers.SerializerMethodField()
  98. bound_batch = serializers.SerializerMethodField()
  99. detail_code = serializers.CharField(read_only=True, required=False)
  100. status = serializers.IntegerField(read_only=False, required=False)
  101. # 定义其他字段,只读
  102. creater = serializers.CharField(source='creater.username', read_only=True)
  103. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  104. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  105. class Meta:
  106. # 指定模型和字段,所有字段只读
  107. model = BoundDetailModel
  108. fields = [
  109. 'id',
  110. 'bound_list',
  111. 'bound_batch',
  112. 'detail_code',
  113. 'creater',
  114. 'create_time',
  115. 'update_time',
  116. 'is_delete',
  117. 'status'
  118. ]
  119. read_only_fields = ['__all__']
  120. def get_bound_list(self, obj):
  121. """ 动态序列化关联的主单数据 """
  122. from .serializers import BoundListGetSerializer # 延迟导入避免循环引用
  123. return BoundListGetSerializer(obj.bound_list).data
  124. def get_bound_batch(self, obj):
  125. """ 动态序列化关联的批次数据 """
  126. from .serializers import BoundBatchGetSerializer
  127. return BoundBatchGetSerializer(obj.bound_batch).data
  128. class BoundDetailPostSerializer(serializers.ModelSerializer):
  129. # 使用主键ID关联主单和批次
  130. bound_list = serializers.PrimaryKeyRelatedField(
  131. queryset=BoundListModel.objects.all(),
  132. help_text="关联主单ID(必须已存在)",
  133. error_messages={
  134. 'does_not_exist': "指定主单不存在",
  135. 'incorrect_type': "主单ID格式错误"
  136. }
  137. )
  138. bound_batch = serializers.PrimaryKeyRelatedField(
  139. queryset=BoundBatchModel.objects.all(),
  140. help_text="关联批次ID(必须已存在)",
  141. error_messages={
  142. 'does_not_exist': "指定批次不存在",
  143. 'incorrect_type': "批次ID格式错误"
  144. }
  145. )
  146. # 创建人字段,必须填写
  147. creater = serializers.CharField(
  148. required=True,
  149. max_length=255,
  150. help_text="创建人标识(建议从用户系统获取)",
  151. error_messages={
  152. 'blank': "创建人不能为空",
  153. 'max_length': "最长255个字符"
  154. }
  155. )
  156. detail_code = serializers.CharField(read_only=False, required=False)
  157. status = serializers.IntegerField(read_only=False, required=False)
  158. class Meta:
  159. # 指定模型和字段,部分字段只读
  160. model = BoundDetailModel
  161. fields='__all__'
  162. read_only_fields = [
  163. 'id',
  164. 'create_time',
  165. 'update_time',
  166. 'is_delete'
  167. ]
  168. extra_kwargs = {
  169. 'is_delete': {
  170. 'default': False,
  171. 'help_text': "逻辑删除标记(默认False)"
  172. }
  173. }
  174. class OutBatchGetSerializer(serializers.ModelSerializer):
  175. class Meta:
  176. model = OutBatchModel
  177. fields = '__all__'
  178. read_only_fields = ['id', 'openid']
  179. class OutBatchPostSerializer(serializers.ModelSerializer):
  180. out_number = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  181. out_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  182. out_note = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  183. out_date = serializers.DateTimeField(read_only=False, required=False, validators=[datasolve.data_validate])
  184. warehouse_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  185. warehouse_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  186. goods_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  187. goods_desc = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])
  188. goods_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  189. goods_out_qty = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])
  190. creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])
  191. class Meta:
  192. model = OutBatchModel
  193. fields = '__all__'
  194. read_only_fields = ['id', 'openid']
  195. class BatchLogGetSerializer(serializers.ModelSerializer):
  196. class Meta:
  197. model = BatchLogModel
  198. fields = '__all__'
  199. read_only_fields = ['id', 'openid']
  200. class OutBoundDetailGetSerializer(serializers.ModelSerializer):
  201. # 嵌套展示关联的主单和批次信息
  202. bound_list = serializers.SerializerMethodField()
  203. bound_batch = serializers.SerializerMethodField()
  204. bound_batch_number = serializers.SerializerMethodField()
  205. detail_code = serializers.CharField(read_only=True, required=False)
  206. status = serializers.IntegerField(read_only=False, required=False)
  207. # 定义其他字段,只读
  208. creater = serializers.CharField(source='creater.username', read_only=True)
  209. create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  210. update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')
  211. class Meta:
  212. # 指定模型和字段,所有字段只读
  213. model = OutBoundDetailModel
  214. fields = [
  215. 'id',
  216. 'bound_list',
  217. 'bound_batch',
  218. 'bound_batch_number',
  219. 'detail_code',
  220. 'creater',
  221. 'create_time',
  222. 'update_time',
  223. 'is_delete',
  224. 'status'
  225. ]
  226. read_only_fields = ['__all__']
  227. def get_bound_list(self, obj):
  228. """ 动态序列化关联的主单数据 """
  229. from .serializers import BoundListGetSerializer # 延迟导入避免循环引用
  230. return BoundListGetSerializer(obj.bound_list).data
  231. def get_bound_batch(self, obj):
  232. from .serializers import OutBatchGetSerializer
  233. return OutBatchGetSerializer(obj.bound_batch).data
  234. def get_bound_batch_number(self, obj):
  235. from .serializers import BoundBatchGetSerializer
  236. return BoundBatchGetSerializer(obj.bound_batch_number).data
  237. class OutBoundDetailPostSerializer(serializers.ModelSerializer):
  238. # 使用主键ID关联主单和批次
  239. bound_list = serializers.PrimaryKeyRelatedField(
  240. queryset=BoundListModel.objects.all(),
  241. help_text="关联主单ID(必须已存在)",
  242. error_messages={
  243. 'does_not_exist': "指定主单不存在",
  244. 'incorrect_type': "主单ID格式错误"
  245. }
  246. )
  247. bound_batch = serializers.PrimaryKeyRelatedField(
  248. queryset=OutBatchModel.objects.all(),
  249. help_text="关联批次ID(必须已存在)",
  250. error_messages={
  251. 'does_not_exist': "指定批次不存在",
  252. 'incorrect_type': "批次ID格式错误"
  253. }
  254. )
  255. # 创建人字段,必须填写
  256. creater = serializers.CharField(
  257. required=True,
  258. max_length=255,
  259. help_text="创建人标识(建议从用户系统获取)",
  260. error_messages={
  261. 'blank': "创建人不能为空",
  262. 'max_length': "最长255个字符"
  263. }
  264. )
  265. detail_code = serializers.CharField(read_only=False, required=False)
  266. status = serializers.IntegerField(read_only=False, required=False)
  267. class Meta:
  268. # 指定模型和字段,部分字段只读
  269. model = OutBoundDetailModel
  270. fields='__all__'
  271. read_only_fields = [
  272. 'id',
  273. 'create_time',
  274. 'update_time',
  275. 'is_delete'
  276. ]
  277. extra_kwargs = {
  278. 'is_delete': {
  279. 'default': False,
  280. 'help_text': "逻辑删除标记(默认False)"
  281. }
  282. }