序列化用户和配置文件django rest框架的创建

时间:2017-05-02 05:12:50

标签: python django django-rest-framework

我正在尝试通过DRF创建用户及其个人资料,但我找不到正确的方法。

这是我的models.py

from __future__ import unicode_literals
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
from django.db import models

class Profile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)
    language = models.CharField(max_length=4, default='es')

    def __unicode__(self):
            return "%s - %s" % (self.user, self.language)

我的serializers.py

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

class ProfileCreateSerializer(serializers.ModelSerializer):

username = serializers.CharField(source='user.username')

class Meta:

    model = Profile
    fields = [
    'username',
    'language',
    ]

def create (self, validated_data):

    user = get_user_model().objects.create(username=validated_data['username'])
    user.set_password(User.objects.make_random_password())
    user.save()

    profile = Profile.objects.create(user = user)

    return profile

my views.py

from rest_framework.response import Response
from rest_framework.generics import CreateAPIView
from serializers import ProfileCreateSerializer
from models import Profile

class ProfileCreateAPIView(CreateAPIView):

    model = Profile
    serializer_class = ProfileCreateSerializer

我的urls.py

from django.conf.urls import patterns, include, url
import views
from django.contrib import admin

urlpatterns = [
    url(r'^', views.ProfileCreateAPIView.as_view(), name='crear perfil'),
]

如果我尝试创建它会向我显示此错误:

Cannot assign "{u'username': u'test'}": "Profile.user" must be a "User" instance.

如果我创建了一个用户并且他的个人资料通过管理面板没有显示任何错误。

我的admin.py:

from django.contrib import admin
from models import Profile
from django.contrib.auth.admin import UserAdmin

class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Perfil'
    fk_name = 'user'

class UserAdmin(UserAdmin):
    inlines = (ProfileInline,)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

我正在使用django 1.9.1和django rest framework 3.3.2

1 个答案:

答案 0 :(得分:2)

为什么首先需要UserSerializer?将您的ProfileCreateSerializer更改为以下内容。它应该工作

class ProfileCreateSerializer(serializers.ModelSerializer):
   username = serializers.CharField(source='user.username')

   class Meta:
       model = Profile
       fields = [
       'username',
       'language',
       ]

   def create (self, validated_data):
    user = get_user_model().objects.create(username=validated_data['username'])
    user.set_password(User.objects.make_random_password())
    user.save()

    profile = Profile.objects.create(user = user)

    return profile

由于create方法在序列化程序中被覆盖,因此您需要将数据作为序列化程序进程的格式发送。因此,您需要在视图中覆盖POST请求并创建数据,如下所示:

from rest_framework import status
from rest_framework.response import Response

class ProfileCreateAPIView(CreateAPIView):
    model = Profile
    serializer_class = ProfileCreateSerializer

    def post(self, request, *args, **kwargs):
        data = {
            'username': request.data.get('username', None),
            'language': request.data.get('language', None),

        }

        serializer = ProfileCreateSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response(
                serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response( serializer.errors, status=status.HTTP_400_BAD_REQUEST)