我正在使用帶有 Django Rest Knox 身份驗證的 Rest API 在 Django Rest Framework 中創建一個簡單的注冊/登錄應用程式,其中,在注冊時,用戶還將上傳一個 CSV 檔案(這是一個可選欄位)。
我有一個Person模型,它是模型的擴展(派生或OneToOne)模型,User并且FileField必須上傳檔案。
我有兩個ModelSerializer,一個基于UserModel named和MainRegisterSerializerserializesusername和fields,另一個基于Model named序列化和field(使用類的建構式初始化。emailpasswordPersonRegisterSerializerFileFieldregisterMainRegisterSerializer
現在,在 中views.py,我正在訪問RegisterSerializer, 以從前面獲取資料,其中包括username來自Model和Model 的欄位email和欄位。passwordUserFileFieldPerson
但是,當我在前端輸入資料并上傳檔案,然后單擊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 上介紹的各種解決方案,但沒有一個對我有用,這就是我發布問題的原因。任何幫助都將不勝感激。謝謝。
uj5u.com熱心網友回復:
如果您查看您可以看到的經過驗證的資料,則屬于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']
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/453162.html
標籤:python-3.x django django-rest-framework django-序列化器 django-rest-knox
下一篇:SocketIO顫動未連接
