Может ли кто-нибудь объяснить мне, что означает "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}}
Вернуться на верх