Почему мой сериализатор не может обновлять имя и биографию одновременно? Проверенные данные имеют только одно ключевое значение - био - PullRequest
0 голосов
/ 01 декабря 2019

Я пытаюсь обновить профиль моего пользователя и наткнулся на проблему: биография обновляется, а имя нет. Используя отладчик, он показывает мне, что validated_data имеет только пару ключ-значение «био» и возвращает None для имени, хотя мой ввод в Browsable API это имя + био.

Отладчик:

validated_data = {'bio': 'small update'}
new_name = validated_data.get('name')
new_name = None

Что я передаю в Browsable API:

{
    "name": "ttt_changed,
    "bio": "small update"
}

Вот мой сериализатор:

class ProfileSerializer (serializers.ModelSerializer):


    name = serializers.CharField(source='user.username',
                                         read_only=True)
    image = serializers.ImageField(use_url=True, required=False)

    def update(self, instance, validated_data):
        new_name = validated_data.get('name')
        myuser = validated_data.get('user', instance.user)
        myuser_username = validated_data.get('name', myuser.username)
        myuser.save()

        instance.bio = validated_data.get('bio', profile.bio)
        instance.save()

        return instance, myuser

    class Meta:
        model = Profile
        fields = ('name', 'bio', 'image')

MyUser имеет отношение один-к-одному с моделью профиля.

Заранее благодарю за ваши ответы, я не могу понять, почему проверенные данные не содержат имени ..

1 Ответ

2 голосов
/ 01 декабря 2019

первая проблема ниже:

name = serializers.CharField(source='user.username',read_only=True)

вы написали, что read_only имеет значение True, и это потому, что вы не можете видеть имя в ваших ключах validated_data.

, а следующая проблема -здесь:

myuser_username = validated_data.get('name', myuser.username)

подчеркивание не должно использоваться между myuser и username, потому что username является атрибутом объекта myuser, и вы должны использовать точку между ними, как показано ниже:

myuser.username = validated_data.get('name', myuser.username)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...