Django Rest Framework - “Got a `TypeError` when ca

2019-08-02 21:20发布

When i am trying to POST using the browsable API of DRF, i get the following error:

Got a TypeError when calling Note.objects.create(). This may be because you have a writable field on the serializer class that is not a valid argument to Note.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')

1条回答
在下西门庆
2楼-- · 2019-08-02 21:56

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()
查看更多
登录 后发表回答