如何访问 Django Rest Framework 中扩展用户模型序列化程序中的用户模型字段?
How do I access User Model field in the Serializer of extended User Model in Django Rest Framework?
我正在 Django Rest Framework 中创建一个简单的 registration/login 应用程序,使用带有 Django Rest Knox 身份验证的 Rest API,其中,在注册时,用户还将上传一个 CSV 文件(这是一个可选字段)。
我有一个 Person
模型,它是 User
模型的扩展(派生或 OneToOne
)模型,并且有 FileField
用于要上传的文件。
我有两个 ModelSerializer
,一个基于 User
模型,名为 MainRegisterSerializer
并序列化 username
、email
和 password
字段,另一个基于名为 RegisterSerializer
的 Person
模型,它序列化 FileField
和 register
字段(用 MainRegisterSerializer
class 初始化的构造函数。
现在,在 views.py
中,我正在访问 RegisterSerializer
,以从前面获取数据,其中包括 username
、email
和 password
来自 User
模型的字段,以及来自 Person
模型的 FileField
。
但是,当我在前端输入数据并上传文件,然后点击 POST
按钮时,出现以下错误:
KeyError at /api/v1/register
'username'
在 serializers.py
文件中的代码行 user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'], validated_data['file'])
上。
我的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")
我已经通过在 Whosebug 上尝试各种解决方案来解决问题,但是 none 其中对我有用,这就是我发布问题的原因。任何帮助都将不胜感激。谢谢。
如果您查看经过验证的数据,您会发现属于 MainRegisterSerializer
序列化程序的数据将可通过 register
密钥使用。并且属于 RegisterSerializer
序列化程序的数据将通过 file
键可用。
验证数据:
{'register': OrderedDict([('username', 'test'), ('email', 'test@gmail.com'), ('password', 'test123')]), 'file': <InMemoryUploadedFile: filename.txt (text/csv)>}
因此,要访问您需要使用的任何注册字段:
validated_data['register']['username'], validated_data['register']['email'] ..etc.
要访问您可以使用的文件:validated_data['file']
我正在 Django Rest Framework 中创建一个简单的 registration/login 应用程序,使用带有 Django Rest Knox 身份验证的 Rest API,其中,在注册时,用户还将上传一个 CSV 文件(这是一个可选字段)。
我有一个 Person
模型,它是 User
模型的扩展(派生或 OneToOne
)模型,并且有 FileField
用于要上传的文件。
我有两个 ModelSerializer
,一个基于 User
模型,名为 MainRegisterSerializer
并序列化 username
、email
和 password
字段,另一个基于名为 RegisterSerializer
的 Person
模型,它序列化 FileField
和 register
字段(用 MainRegisterSerializer
class 初始化的构造函数。
现在,在 views.py
中,我正在访问 RegisterSerializer
,以从前面获取数据,其中包括 username
、email
和 password
来自 User
模型的字段,以及来自 Person
模型的 FileField
。
但是,当我在前端输入数据并上传文件,然后点击 POST
按钮时,出现以下错误:
KeyError at /api/v1/register
'username'
在 serializers.py
文件中的代码行 user = User.objects.create_user(validated_data['username'], validated_data['email'], validated_data['password'], validated_data['file'])
上。
我的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")
我已经通过在 Whosebug 上尝试各种解决方案来解决问题,但是 none 其中对我有用,这就是我发布问题的原因。任何帮助都将不胜感激。谢谢。
如果您查看经过验证的数据,您会发现属于 MainRegisterSerializer
序列化程序的数据将可通过 register
密钥使用。并且属于 RegisterSerializer
序列化程序的数据将通过 file
键可用。
验证数据:
{'register': OrderedDict([('username', 'test'), ('email', 'test@gmail.com'), ('password', 'test123')]), 'file': <InMemoryUploadedFile: filename.txt (text/csv)>}
因此,要访问您需要使用的任何注册字段:
validated_data['register']['username'], validated_data['register']['email'] ..etc.
要访问您可以使用的文件:validated_data['file']