我有一个类似的序列化程序
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())
如何做到这一点?
您可以使用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
如果要将这些ID保存在模型上,则可以使用ModelSerializer
和pre_save
信号来实现:
# 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