django-rest-framework:无法调用`.is_valid()`,因为在实例化序列化程序实例时没有传递`data=`关键字参数
django-rest-framework: Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance
我有以下型号:
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)
以及以下序列化程序:
class PatientNoteSerializer(serializers.ModelSerializer):
class Meta:
model = PatientNote
我只想在 PatientNote 上做一个 POST。 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)
request.data是一个QueryDict,即
<QueryDict: {u'category': [u'1'], u'patient': [u'1'], u'description': [u'da rest']}>
它将能够通过他们的 ID 填充患者和类别这两个 FK,并且描述是一个简单的文本。
POST 请求如下(适用于其他型号):
无论如何,POST 响应为 500,但出现以下错误:
AssertionError at /api/notes/
无法调用 .is_valid()
,因为在实例化序列化程序实例时未传递 data=
关键字参数。
如果我尝试在 python shell 中使用它,错误是相同的。
当您想要序列化对象时,您将对象作为第一个参数传递。
serializer = CommentSerializer(comment)
serializer.data
# {'email': u'leila@example.com', 'content': u'foo bar', 'created': datetime.datetime(2012, 8, 22, 16, 20, 9, 822774)}
但是当你想反序列化时,你可以使用 data
kwarg 传递数据。
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)}
所以在你的情况下你想反序列化你的 post 数据,因此你必须这样做:
serializer = PatientNoteSerializer(data=request.data)
我有以下型号:
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)
以及以下序列化程序:
class PatientNoteSerializer(serializers.ModelSerializer):
class Meta:
model = PatientNote
我只想在 PatientNote 上做一个 POST。 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)
request.data是一个QueryDict,即
<QueryDict: {u'category': [u'1'], u'patient': [u'1'], u'description': [u'da rest']}>
它将能够通过他们的 ID 填充患者和类别这两个 FK,并且描述是一个简单的文本。
POST 请求如下(适用于其他型号):
无论如何,POST 响应为 500,但出现以下错误:
AssertionError at /api/notes/
无法调用 .is_valid()
,因为在实例化序列化程序实例时未传递 data=
关键字参数。
如果我尝试在 python shell 中使用它,错误是相同的。
当您想要序列化对象时,您将对象作为第一个参数传递。
serializer = CommentSerializer(comment)
serializer.data
# {'email': u'leila@example.com', 'content': u'foo bar', 'created': datetime.datetime(2012, 8, 22, 16, 20, 9, 822774)}
但是当你想反序列化时,你可以使用 data
kwarg 传递数据。
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)}
所以在你的情况下你想反序列化你的 post 数据,因此你必须这样做:
serializer = PatientNoteSerializer(data=request.data)