【问题标题】:Django Rest Framework - "Got a `TypeError` when calling `Note.objects.create()'"Django Rest 框架 - “调用 `Note.objects.create()' 时出现 `TypeError`”
【发布时间】: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


【解决方案1】:

我认为这是因为您提供了关键字参数data 来保存方法。这是不必要的。 save() 没有这样的论点。试试这个:

def perform_create(self, serializer):
    serializer.save()

【讨论】:

  • 哇,成功了!我敢肯定我把这些 args 放在那里是有原因的,但是已经很久了,我不记得为什么了。非常感谢!
猜你喜欢
  • 2013-12-29
  • 2018-09-02
  • 2022-08-17
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多