Django rest framework и получение значений сериализатора с использованием исходного ключевого слова - PullRequest
0 голосов
/ 19 января 2019

У меня есть две модели, одна из которых является базовой User моделью, а другая - Profile моделью, которая используется для расширения модели User и сохранения более подробной информации.

Вот что UserSerializer выглядит следующим образом:

from django.contrib.auth.models import User
from profiles.models import Profile
from rest_framework import serializers


class UserSerializer(serializers.ModelSerializer):
    reputation = serializers.IntegerField(
        read_only=True,
        source='profile.reputation'
    )

    class Meta:
        exclude = ('password',)
        model = User

    def create(self, validated_data):
        password = validated_data.get('password')
        user = User.objects.create(**validated_data)
        user.set_password(password)
        user.save()

        Profile.objects.create(user=user)

        return user

Как видите, это переопределяет метод create, поэтому он может делать запись профиля при каждом создании.Также к сериализатору добавляется поле reputation, поэтому, когда я получаю User, он получает свою репутацию из профиля.Это поле reputation определено в модели Profile.

Это заставило меня задуматься, можно ли переопределить create таким образом, чтобы я мог отправлять данные в одну конечную точку и создавать профили водин ход?Например, прямо сейчас, если я хочу создать пользователей, и я просто отправляю запрос POST на свою конечную точку с помощью:

{
    "username": "sethen",
    "password": "password"
}

И я возвращаю правильный профиль.Если бы я добавил поле bio к моей модели Profile, поместил его в UserSerializer и отправил вместе с POST, например, так:

{
    "bio": "It's me, Sethen!",
    "username": "sethen",
    "password": "password"
}

И затем попытайтесь получить доступчто в моем методе create я получаю KeyError с validated_data.pop('reputation').

Прямо сейчас в моем API вы можете обновлять профили пользователей отдельно с другой конечной точкой ... Однако мне интересно, еслиЯ могу обновить пользователя и профиль с помощью одной конечной точки, используя метод create в моем UserSerializer как-нибудь?

1 Ответ

0 голосов
/ 19 января 2019

Данные 'reputation' вложены в dict под клавишей 'profile'.Вам нужно вставить этот дикт и передать его в профиль:

def create(self, validated_data):
    profile_data = validated_data.pop('profile')
    password = validated_data.get('password')
    user = User.objects.create(**validated_data)
    user.set_password(password)
    user.save()

    Profile.objects.create(user=user, **profile_data)

    return user
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...