2017-05-02 14 views
0

私はDRFを使用してユーザーと彼のプロファイルを作成しようとしていますが、正しい方法はありません。ユーザーとプロファイルの作成をシリアル化するdjango rest framework

は、ここに私の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 

私の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) 

私はジャンゴ1.9.1を使用して、あなたが最初の場所でUserSerializerが必要なのはなぜ3.3.2

答えて

0

残りのフレームワークをDjangoのよ? ProfileCreateSerializerを以下のように変更してください。それは動作するはずです

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) 
+0

: Field.to_internal_valueを()を実装する必要があります。 –

+0

上記のように、serializers.fieldをCharFieldに変更します。 '' 'username = serializers.CharField(source = 'user.username')' '' –

+0

が完了しました。これでキーエラー 'username'というエラーが表示されます –

関連する問題