我正在 Django Rest Framework 中使用 Rest API 和 Django Rest Knox 的身份验证创建一个简单的注册/登录应用程序,其中在注册时,用户还将上传一个 CSV 文件(这是一个可选字段)。
我有一个
Person
模型,它是 OneToOne
模型的扩展(派生或 User
)模型,并具有 FileField
用于要上传的文件。
我有两个
ModelSerializer
,一个基于名为 User
的 MainRegisterSerializer
模型并序列化 username
、email
和 password
字段,另一个基于名为 Person
的 RegisterSerializer
模型,它序列化 FileField
和 register
字段(使用 MainRegisterSerializer
类的构造函数初始化。
现在,在
views.py
中,我正在访问RegisterSerializer
,以从前面获取数据,其中包括来自username
模型的email
、password
和User
字段以及来自FileField
的
Person
字段型号。
但是,当我在前端输入数据并上传文件,然后单击
POST
按钮时,出现以下错误:
KeyError at /api/v1/register
'username'
在
user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'], validated_data['file'])
文件中的代码行 serializers.py
上。
我的
views.py
是:
from rest_framework.response import Response
from knox.models import AuthToken
from .serializers import RegisterSerializer
class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
token = AuthToken.objects.create(user)
return Response({
"users": UserSerializer(user, context=self.get_serializer_context()).data,
"token": token[1]
})
我的
serializers.py
是:
from .models import Person
from django.contrib.auth.models import User
from rest_framework import serializers
class MainRegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username', 'email', 'password')
class RegisterSerializer(serializers.ModelSerializer):
register = MainRegisterSerializer()
class Meta:
model = Person
fields = ['register', 'file',]
optional_fields = ['file',]
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'], validated_data['file'])
return user
我的
models.py
是:
from django.db import models.
from django.contrib.auth.models import User
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
file = models.FileField(verbose_name="CSV File")
我已经通过尝试 stackoverflow 上提供的各种解决方案来解决问题,但没有一个对我有用,这就是我发布这个问题的原因。任何帮助都将不胜感激。谢谢。
如果您查看经过验证的数据,您可以看到,属于
MainRegisterSerializer
序列化器的数据将通过 register
键可用。并且属于 RegisterSerializer
序列化器的数据将通过 file
键可用。
验证数据:
{'register': OrderedDict([('username', 'test'), ('email', '[email protected]'), ('password', 'test123')]), 'file': <InMemoryUploadedFile: filename.txt (text/csv)>}
因此要访问您需要使用的任何注册字段:
validated_data['register']['username'], validated_data['register']['email'] ..etc.
要访问您可以使用的文件:
validated_data['file']
我有一个问题 类 RegisterSerializer(ModelSerializer): 用户名 = CharField(必填=True)
class Meta:
model = User
fields = ['username', 'password', 'email']
def create(self, validated_data):
if User.objects.filter(username=validated_data['username']).exists():
raise ValidationError('ushbu username mavjud!')
if User.objects.filter(email=validated_data['email']).exists():
raise ValidationError("ushbu email mavjud!")
user = User.objects.create_user(
username=validated_data['username'],
password=validated_data['password'],
email=validated_data['email']
)
return user
此消息是为此序列化程序中的第一个用户名给出的 if User.objects.filter(username=validated_data['username']).exists(): raise ValidationError('ushbu 用户名 mavjud!') 它可以工作,但不会出现电子邮件的验证消息: if User.objects.filter(email=validated_data['email']).exists(): 引发 ValidationError("ushbu email mavjud!") 相反,drf 来自其默认消息:
“电子邮件”:[ “使用此电子邮件的用户已存在。” ] 为什么要使用它?