django-rest-framework:无法调用`.is_valid()`,因为在实例化序列化器实例时没有传递`data =`关键字参数

enn*_*oma 14 python django post django-rest-framework

我有以下型号:

class NoteCategory(models.Model):
    title = models.CharField(max_length=100, unique=True)

    def __unicode__(self):
        return '{}'.format(self.title)

class PatientNote(models.Model):
    category = models.ForeignKey(NoteCategory)
    patient = models.ForeignKey(Patient)
    description = models.CharField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '{}'.format(self.description)
Run Code Online (Sandbox Code Playgroud)

以下序列化器:

class PatientNoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = PatientNote
Run Code Online (Sandbox Code Playgroud)

我只想在PatientNote上发布一个帖子.GET工作以及其他模型上的POST正常工作:

class PatientNoteViewSet(APIView):
    queryset = PatientNote.objects.all()


    def post(self, request, format=None):
        if not request.auth:
            return Response({})
        token = Token.objects.filter(key=request.auth)[0]
        user = token.user

        serializer = PatientNoteSerializer(request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)

request.data是一个QueryDict,即

<QueryDict: {u'category': [u'1'], u'patient': [u'1'], u'description': [u'da rest']}>
Run Code Online (Sandbox Code Playgroud)

它可以通过他们的ID填充两个FK,患者和类别,描述是一个简单的文本.

POST请求是以下一个(与其他模型一起使用): 在此输入图像描述

无论如何,POST响应为500,出现以下错误:

AssertionError at /api/notes/
Run Code Online (Sandbox Code Playgroud)

在实例化序列化程序实例时,无法调用,.is_valid()因为没有data=传递关键字参数.

如果我尝试在python shell中使用它,则错误是相同的.

Tod*_*dor 32

如果要序列化对象,则将对象作为第一个参数传递.

serializer = CommentSerializer(comment)
serializer.data
# {'email': u'leila@example.com', 'content': u'foo bar', 'created': datetime.datetime(2012, 8, 22, 16, 20, 9, 822774)}
Run Code Online (Sandbox Code Playgroud)

但是当你想要反序列化时,你用datakwarg 传递数据.

serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,您希望反序列化您的帖子数据,因此您必须这样做:

serializer = PatientNoteSerializer(data=request.data)
Run Code Online (Sandbox Code Playgroud)