У меня есть две модели, одна из которых является базовой 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
как-нибудь?