Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 序列化用户和配置文件django rest框架的创建_Python_Django_Django Rest Framework - Fatal编程技术网

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

Python 序列化用户和配置文件django rest框架的创建,python,django,django-rest-framework,Python,Django,Django Rest Framework,我试图通过DRF创建一个用户和他的个人资料,但我没有找到正确的方法 这是我的模特 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 = mode

我试图通过DRF创建一个用户和他的个人资料,但我没有找到正确的方法

这是我的模特

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)
我的序列化程序.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
我的观点

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
我的URL.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

为什么首先需要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)

为什么首先需要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)

它显示:必须实现Field.to_internal_value()。如上所述,将serializers.Field更改为CharField
username=serializers.CharField(source='user.username')
done,现在显示了一个错误,只是说了一个关键错误'username',你能检查你的验证数据吗?您应该在已验证的_数据字典中有“username”。已修复,现在显示无法分配“{u'username':u'ddesq'}”的情况:“Profile.user”必须是“user”实例。有什么想法吗|它显示:必须实现Field.to_internal_value()。如上所述,将serializers.Field更改为CharField
username=serializers.CharField(source='user.username')
done,现在显示了一个错误,只是说了一个关键错误'username',你能检查你的验证数据吗?您应该在已验证的_数据字典中有“username”。已修复,现在显示无法分配“{u'username':u'ddesq'}”的情况:“Profile.user”必须是“user”实例。有什么想法吗|