DRF ModelSerializer CharField с источником не отображается в validated_data - PullRequest
0 голосов
/ 21 мая 2018

У меня есть такая модель:

class AppUser(models.Model):
    user = models.OneToOneField(User, related_name='app_user')

И у меня есть сериализатор для этого класса:

class AppUserSerializer(serializers.ModelSerializer):
    first_name = serializers.CharField(source='user.first_name')

    class Meta:
        model = AppUser
        fields = ('first_name',)

def create(self, validated_data):
    first_name = validated_data.pop('first_name')
    user = User.objects.create_user(username='test', first_name=first_name, last_name='test')
    app_user = AppUser.objects.create(**validated_data, user=user)
    return app_user

Но когда я пытаюсь создать пользователя с этим сериализатором, хотяЯ посылаю параметр с именем first_name Я получаю эту ошибку:

KeyError: 'first_name'

И когда я запускаю программу в режиме отладки, я вижу, что validated_data пусто!

Еще один момент: когда я добавляю write_only к полю, оно появляется в validated_data, но я не хочу, чтобы поле было write_only!

Кажется, что-то делает это поле read_only, как я могу это изменить?

1 Ответ

0 голосов
/ 21 мая 2018

Validated_data не содержит first_name данных напрямую.Он включен во вложенный словарь user.Поэтому сначала вы должны получить user данные в методе создания:

def create(self, validated_data):
    user_data = validated_data.pop('user')
    first_name = user_data.pop('first_name')
    user = User.objects.create_user(username='test', first_name=first_name, last_name='test')
    app_user = AppUser.objects.create(**validated_data, user=user)
    return app_user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...