【问题标题】:How to set a default field in a serializer to be the same as another field in the same serializer?如何将序列化程序中的默认字段设置为与同一序列化程序中的另一个字段相同?
【发布时间】:2020-10-02 16:53:51
【问题描述】:

我有一个这样的序列化器

class SomeSerializer(serializers.Serializer):
   id = serializers.UUIDField(required=False, default=uuid.uuid4)
   anotherId = serializers.UUIDField(required=False, default = ????)

我想将字段“anotherId”默认设置为与“id”相同。

这是我所期望的

s = SomeSerializer(data={}).
data = s.data
data.id # return '56e34c58-be7d-4c7c-992a-43080faf5614'
data.anotherId #  return '56e34c58-be7d-4c7c-992a-43080faf5614' (as id)

我试着像这里那样做,但是没有用

class SomeSerializer(serializers.Serializer):
       id = serializers.UUIDField(required=False, default=uuid.uuid4)
       anotherId = serializers.UUIDField(required=False, default = id.get_default())

如何做到这一点?

【问题讨论】:

    标签: python django django-models django-rest-framework django-serializer


    【解决方案1】:

    您可以为此使用to_representation 方法:

    class SomeSerializer(serializers.Model):
      id = serializers.UUIDField(required=False, default=uuid.uuid4)
      another_id = serializers.UUIDField(required=False)
    
      def to_representation(self, instance):
        data = super().to_representation(instance)
        if not data.get('another_id', None):
          data['another_id'] = data['id']
        return data
    

    【讨论】:

      【解决方案2】:

      如果您要将这些 ID 保存在模型上,那么您可以使用 ModelSerializerpre_save signal 来实现它:

      # serializers.py
      class SomeSerializer(serializers.Model):
       id = serializers.UUIDField(required=False, default=uuid.uuid4)
       another_id = serializers.UUIDField(required=False)
      
       class Meta
         model = MyModel
      
      # models.py
      from django.db.models.signals import pre_save
      
      ...
      
      @receiver(pre_save, sender=MyModel)
      def set_default_another_id(sender, instance, **kwargs):
        if not instance.another_id:
          instance.another_id = instance.id
      

      【讨论】:

      • 我不会将它保存在模型中。该序列化程序仅用于映射请求数据。我希望字段 'id' 和 'anotherId 使用相同的值生成,除非客户端另有说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多