如何访问 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 并序列化 usernameemailpassword字段,另一个基于名为 RegisterSerializerPerson 模型,它序列化 FileFieldregister 字段(用 MainRegisterSerializer class 初始化的构造函数。

现在,在 views.py 中,我正在访问 RegisterSerializer,以从前面获取数据,其中包括 usernameemailpassword来自 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']