简体   繁体   English

序列化用户和配置文件Django Rest框架的创建

[英]Serialize the creation of user and profile django rest framework

I'm trying to create an user and his profile through DRF, but I don't find the correct way to do it. 我正在尝试通过DRF创建用户及其个人资料,但找不到正确的方法。

Here's my models.py 这是我的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)

my serializers.py 我的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 我的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

My urls.py 我的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'),
]

if I try to create it shows me this error: 如果我尝试创建它,则会显示此错误:

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

if i create an user and his profile via admin panel doesn't show me any error. 如果我创建了一个用户,并且通过管理面板创建的个人资料没有显示任何错误。

my admin.py: 我的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)

I'm using django 1.9.1 and django rest framework 3.3.2 我正在使用django 1.9.1和django rest框架3.3.2

Why do you need UserSerializer at first place? 为什么首先需要UserSerializer? Change your ProfileCreateSerializer to following. 将您的ProfileCreateSerializer更改为以下内容。 It should work 它应该工作

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

Since the create method is override at your serializer, you need to send the data as a format the serializer process. 由于您的序列化程序将覆盖create方法,因此您需要以序列化程序进程的格式发送数据。 So, you need to override the POST request at the views and create data as follows : 因此,您需要在视图上覆盖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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM