Python 序列化用户和配置文件django rest框架的创建
我试图通过DRF创建一个用户和他的个人资料,但我没有找到正确的方法 这是我的模特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
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更改为CharFieldusername=serializers.CharField(source='user.username')
done,现在显示了一个错误,只是说了一个关键错误'username',你能检查你的验证数据吗?您应该在已验证的_数据字典中有“username”。已修复,现在显示无法分配“{u'username':u'ddesq'}”的情况:“Profile.user”必须是“user”实例。有什么想法吗|