serializers.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # @Author : Rocky
  2. # @File : serializers.py
  3. # @Time : 2023/7/24 13:35
  4. from rest_framework.serializers import ModelSerializer, SerializerMethodField
  5. from background.models import ProductInfo, VideoInfo, QuickStartInfo, UpgradeFirmwareInfo
  6. class ReadWriteSerializerMethodField(SerializerMethodField):
  7. """
  8. 支持可读写的SerializerMethodField
  9. 可实现Model字段和Serializer字段更加灵活地解绑
  10. 通过实现get_xxxfield方法,实现从Model的某个字段读值映射到Serializer对应字段
  11. 通过实现set_xxxfield方法,实现从Serializer字段回填值到Model对应字段
  12. """
  13. def __init__(self, method_name=None, write_method_name=None, **kwargs):
  14. self.method_name = method_name
  15. self.write_method_name = write_method_name
  16. kwargs["source"] = "*"
  17. super(SerializerMethodField, self).__init__(**kwargs)
  18. def bind(self, field_name, parent):
  19. # 绑定读函数 get_{field_name} 和写函数 set_{field_name}
  20. default_method_name = f"get_{field_name}"
  21. default_write_method_name = f"set_{field_name}"
  22. if self.method_name is None:
  23. self.method_name = default_method_name
  24. if self.write_method_name is None:
  25. self.write_method_name = default_write_method_name
  26. super(SerializerMethodField, self).bind(field_name, parent)
  27. def to_representation(self, value):
  28. # 读取过程hook
  29. method = getattr(self.parent, self.method_name)
  30. return method(value)
  31. def to_internal_value(self, data):
  32. # 写入过程hook
  33. method = getattr(self.parent, self.write_method_name)
  34. return method(data)
  35. class ProductInfoSerializer(ModelSerializer):
  36. class Meta:
  37. model = ProductInfo
  38. fields = '__all__'
  39. class VideoInSerializer(ModelSerializer):
  40. # link = ReadWriteSerializerMethodField()
  41. class Meta:
  42. model = VideoInfo
  43. fields = '__all__'
  44. def create(self, validated_data):
  45. link = validated_data.get('link')
  46. validated_data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/video_file/{}'.format(link)
  47. video_qs = VideoInfo.objects.create(**validated_data)
  48. return video_qs
  49. def update(self, instance, validated_data):
  50. link = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/video_file/{}'.format(validated_data.get('link'))
  51. instance.link = link
  52. instance.save()
  53. return instance
  54. # @staticmethod
  55. # def get_link(obj):
  56. # file_key = 'vsees/video_file/{}'.format(obj.link)
  57. # s3_obj = AmazonS3Util()
  58. # link = s3_obj.generate_file_obj_url(bucket_name, file_key)
  59. # return link
  60. #
  61. # @staticmethod
  62. # def set_link(obj):
  63. # return {'link': obj}
  64. class QuickStartInfoSerializer(ModelSerializer):
  65. class Meta:
  66. model = QuickStartInfo
  67. fields = '__all__'
  68. def create(self, validated_data):
  69. link = validated_data.get('link')
  70. validated_data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
  71. video_qs = VideoInfo.objects.create(**validated_data)
  72. return video_qs
  73. def update(self, instance, validated_data):
  74. link = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(validated_data.get('link'))
  75. instance.link = link
  76. instance.save()
  77. return instance
  78. class UpgradeFirmwareInfoSerializer(ModelSerializer):
  79. class Meta:
  80. model = UpgradeFirmwareInfo
  81. fields = '__all__'
  82. def create(self, validated_data):
  83. link = validated_data.get('link')
  84. validated_data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(
  85. link)
  86. video_qs = VideoInfo.objects.create(**validated_data)
  87. return video_qs
  88. def update(self, instance, validated_data):
  89. link = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(
  90. validated_data.get('link'))
  91. instance.link = link
  92. instance.save()
  93. return instance