Django Rest Framework-“调用`Note.objects.create()'时出现`TypeError`”。 [英] Django Rest Framework - "Got a `TypeError` when calling `Note.objects.create()'"
问题描述
当我尝试使用DRF的可浏览API进行发布时,出现以下错误:
获得了<$ c $调用
Note.objects.create()
时c> TypeError 。这可能是
,因为您在序列化器类上有一个可写字段,而不是
是Note.objects.create()
的有效参数。您可能需要将
字段设为只读,或者重写NoteSerializer.create()方法以使
能够正确处理此问题。
我不知道是什么产生了此错误或如何克服它。从字面上看,Google花费了数小时搜索或更改代码。有人可以解释如何克服这个错误吗? (请注意,我是Django和DRF的新手!)
这是 models.py
:
从django.db导入模型
从django.utils导入时区
从django.contrib.auth.models导入用户
导入uuid
类Stock(models.Model):
'''
代表股票信息的模型。
'''
用户=模型.ForeignKey(用户)
book_code =模型.CharField(max_length = 14,null = True,blank = True)
def __str __(self):
返回self.book_code
class Note(models.Model):
'''
代表股票票据的模型。
'''
用户=模型.ForeignKey(用户)
注=模型.TextField(max_length = 560)
股票=模型.ForeignKey(股票,related_name ='notes' )
date_note_created = models.DateTimeField(default = timezone.now)
def __str __(self):
返回self.note
这是 views.py
:
从rest_framework导入泛型
从stocknoter.models导入股票,注意
从api.serializers导入StockSerializer,NoteSerializer
#创建您的意见在这里。
类StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
def get_queryset(self):
user = self.request.user
return Stock .objects.filter(user = user)
def perform_create(self,serializer):
serializer.save(user = self.request.user)
def perform_update(self,serializer):
serializer.save(user = self.request.user)
class NoteList(generics.ListCreateAPIView):
serializer_class = NoteSerializer
def get_queryset(self):
user = self.request.user
return Note.objects.filter(user = user)
def perform_create(self,serializer) ):
serializer.save(data = self.request.data)
def perform_update(self,serializer):
serializer.save(data = self.request.data)
这是 serializers.py
:
来自stocknoter.models im港口库存,请注意rest_framework导入序列化器
类中的
StockSerializer(serializers.ModelSerializer):
用户= serializers.HiddenField(default = serializers.CurrentUserDefault())
notes = serializers.PrimaryKeyRelatedField(read_only = True)
类Meta:
模型=股票
字段=('id','user','book_code' ,'notes')
class NoteSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default = serializers.CurrentUserDefault())
class Meta:
模型=注释
字段=('用户','注释','股票')
save()
没有这样的论点。试试这个: def perform_create(self,serializer):
serializer.save()
When i am trying to POST using the browsable API of DRF, i get the following error:
Got a
TypeError
when callingNote.objects.create()
. This may be because you have a writable field on the serializer class that is not a valid argument toNote.objects.create()
. You may need to make the field read-only, or override the NoteSerializer.create() method to handle this correctly.
I don't know what is generating this error or how to overcome it. Literally spent hours google searching or changing the code. Can someone explain how to overcome this error? (Please note i am new to Django and DRF!)
Here is the models.py
:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
import uuid
class Stock(models.Model):
'''
Model representing the stock info.
'''
user = models.ForeignKey(User)
book_code = models.CharField(max_length=14, null=True, blank=True)
def __str__(self):
return self.book_code
class Note(models.Model):
'''
Model representing the stock note.
'''
user = models.ForeignKey(User)
note = models.TextField(max_length=560)
stock = models.ForeignKey(Stock, related_name='notes')
date_note_created = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.note
This is the views.py
:
from rest_framework import generics
from stocknoter.models import Stock, Note
from api.serializers import StockSerializer, NoteSerializer
# Create your views here.
class StockList(generics.ListCreateAPIView):
serializer_class = StockSerializer
def get_queryset(self):
user = self.request.user
return Stock.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def perform_update(self, serializer):
serializer.save(user=self.request.user)
class NoteList(generics.ListCreateAPIView):
serializer_class = NoteSerializer
def get_queryset(self):
user = self.request.user
return Note.objects.filter(user=user)
def perform_create(self, serializer):
serializer.save(data=self.request.data)
def perform_update(self, serializer):
serializer.save(data=self.request.data)
This is the serializers.py
:
from stocknoter.models import Stock, Note
from rest_framework import serializers
class StockSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
notes = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Stock
fields = ('id', 'user', 'book_code', 'notes')
class NoteSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = Note
fields = ('user', 'note', 'stock')
I think this is because you are providing keyword argument data
to save method. This is unnecessary. save()
dont have such argument. Try just this:
def perform_create(self, serializer):
serializer.save()
这篇关于Django Rest Framework-“调用`Note.objects.create()'时出现`TypeError`”。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!