Django Rest framework: создание / обновление объекта с помощью связанного поля

у меня две модели

Auth модель пользователя и UserProfile

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    name = models.CharField(_lazy(u'Name'), max_length=255)

для которого я использую эти сериализаторы:

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

from oneanddone.users.models import UserProfile

    class UserProfileSerializer(serializers.ModelSerializer):

        class Meta:
            model = UserProfile
            fields = ('name',)


    class UserSerializer(serializers.ModelSerializer):
        profile = serializers.RelatedField()

        class Meta:
            model = User
            fields = ('id', 'username', 'email', 'groups', 'profile')

но при оформлении запроса post

requests.post('http://localhost:8000/api/v1/users/', data={"username": "tester", "email": "tester@gmail.com", "profile": [{"name":"testername"}]} ,headers={'Authorization':'Token d81e33c57b2d9471f4d6849bab3cb233b3b30468'}).text

Я получаю следующий объект с полем профиля "null"

u'{"id": 10, "username": "tester", "email": "tester@gmail.com", "groups": [], "profile": null}'

Я не могу понять, как добиться создания и обновления имени профиля пользователя вместе с данными пользователя auth. Пожалуйста, дайте мне знать, как это сделать, и приведите пример для тот же.

2 ответов


на самом деле Django Rest Framework имеет частичную вложенную поддержку. Если вы посмотрите на тесты вы найдете. Что касается вопроса bitgeeky, как сказано в IRC, это должно сработать. Вот ассоциирован теста: https://github.com/tomchristie/django-rest-framework/blob/2.3.13/rest_framework/tests/test_relations_nested.py#L56

думая об этом, я думаю, что у меня была эта ошибка однажды. @bitgeeky можете ли вы убедиться, что отправляете запрос json, добавив тип контента в заголовок ? По умолчанию сообщения будут использовать формы,которые не поддерживают вложенные.


Django Rest Framework в настоящее время не поддерживает вложенные записи, поэтому вам придется создать UserProfile, переопределив create в ListCreateAPIView:

class UserList(generics.ListCreateAPIView):
    model = User
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        data = request.DATA

        # note: transaction.atomic was introduced in Django 1.6
        with transaction.atomic():
            user = User.(
                username=data['username'],
                ...
            )
            user.clean()
            user.save()

            UserProfile.objects.create(
                user=user,
                name=data['profile']['name']
            )

        serializer = UserSerializer(user)
        headers = self.get_success_headers(serializer.data)

        return Response(serializer.data, status=status.HTTP_201_CREATED,
                        headers=headers)

используя transaction.atomic откатит создание пользователя, если профиль не будет успешно сохранен.

редактировать

если вы создаете нового пользователя, вы, вероятно, хотите использовать create_user метод. Приведенный выше код должен был показать общий случай создания экземпляр модели и связанная запись в одном запросе POST API REST.