【发布时间】:2017-07-09 14:14:46
【问题描述】:
当我尝试使用 DRF 的可浏览 API 进行 POST 时,我收到以下错误:
拨打
Note.objects.create()时收到TypeError。这可能是 因为您在序列化程序类上有一个可写字段,而不是Note.objects.create()的有效参数。您可能需要使 字段只读,或覆盖 NoteSerializer.create() 方法以 正确处理。
我不知道是什么导致了这个错误或如何克服它。从字面上看,花了几个小时谷歌搜索或更改代码。有人可以解释如何克服这个错误吗? (请注意我是 Django 和 DRF 的新手!)
这里是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
这是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)
这是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')
【问题讨论】:
-
尝试添加
many=True作为参数:notes = serializers.PrimaryKeyRelatedField(read_only=True, many=True) -
@neverwalkaloner,感谢您的回复。进行了更改,但不幸的是没有任何区别。感谢任何其他建议。
-
你能显示你试图发布的数据吗?
-
通过可浏览的 API,我正在为注释输入文本为“测试”,而对于股票,我正在选择现有的“TST”对象。
标签: django django-rest-framework