如何访问 Django Rest Framework 中扩展用户模型的序列化器中的用户模型字段?

问题描述 投票:0回答:2

我正在 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 上提供的各种解决方案来解决问题,但没有一个对我有用,这就是我发布这个问题的原因。任何帮助都将不胜感激。谢谢。

python-3.x django django-rest-framework django-serializer django-rest-knox
2个回答
1
投票

如果您查看经过验证的数据,您可以看到,属于

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']


0
投票

我有一个问题 类 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 来自其默认消息:

“电子邮件”:[ “使用此电子邮件的用户已存在。” ] 为什么要使用它?

© www.soinside.com 2019 - 2024. All rights reserved.