如何将序列化程序中的默认字段设置为与同一序列化程序中的另一个字段相同?

How to set a default field in a serializer to be the same as another field in the same serializer?

我有这样的序列化器

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())

如何做到这一点?

如果您要将这些 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

您可以使用 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