Может ли кто-нибудь объяснить мне, что означает "data = validated_data.copy()"?
Интересно, почему метод create
не обрабатывает данные напрямую, а вынужден копировать их в data
, а затем обрабатывать косвенно, при этом возвращаемый результат также является обработанным пользователем.
class UserSerializer(serializers.ModelSerializer):
alumni = AlumniSerializer()
def to_representation(self, instance):
req = super().to_representation(instance)
if instance.avatar:
req['avatar'] = instance.avatar.url
if instance.cover:
req['cover'] = instance.cover.url
return req
def create(self, validated_data):
data = validated_data.copy()
user = User(**data)
user.set_password(user.password)
user.save()
return user
class Meta:
model = User
fields = ['id', 'first_name', 'last_name', 'username', 'password', 'email', 'avatar', 'cover', 'alumni']
extra_kwargs = {
'password': {
'write_only': True
}
}
Причина копирования проверенных_данных в новую переменную заключается в том, что исходные проверенные_данные остаются неизменными для сохранения целостности данных и предотвращения непредвиденных побочных эффектов.
Таким образом, если вы измените данные при создании пользователя, это не повлияет на проверенные данные сериализатора
Здесь .copy()
является несенситивным. Действительно, создается копия словаря, но неглубокая копия, так что если одно из значений является списком, он не будет копировать и этот список, а по-прежнему будет ссылаться на старый список.
Теперь, поскольку вы выполняете распаковку словаря, он будет считывать параметры и использовать ключ и значения для создания объекта User
. Таким образом, можно использовать:
class UserSerializer(serializers.ModelSerializer):
alumni = AlumniSerializer()
def to_representation(self, instance):
req = super().to_representation(instance)
if instance.avatar:
req['avatar'] = instance.avatar.url
if instance.cover:
req['cover'] = instance.cover.url
return req
def create(self, validated_data):
user = User(**validated_data)
user.set_password(user.password)
user.save()
return user
class Meta:
model = User
fields = [
'id',
'first_name',
'last_name',
'username',
'password',
'email',
'avatar',
'cover',
'alumni',
]
extra_kwargs = {'password': {'write_only': True}}