2015-04-19 2 views
9

Ich habe folgendes Modell:django-Rest-Rahmen: Der Anruf kann nicht `.is_valid()` wie keine `data =` Schlüsselwort-Argument übergeben wurden, als die Serializer Instanz instanziieren

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) 

Und die folgenden Serializer :

class PatientNoteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = PatientNote 

Ich möchte nur einen POST auf dem PatientNote machen. Die GET-Werke und auch die POST bei anderen Modellen funktioniert:

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) 

Die request.data ist ein QueryDict, dh

<QueryDict: {u'category': [u'1'], u'patient': [u'1'], u'description': [u'da rest']}> 

Es wäre in der Lage, die beiden FKs, Patienten und Kategorie zu füllen , durch ihre IDs und die Beschreibung ist ein einfacher Text.

Die POST-Anforderung ist die folgende (die mit anderen Modellen funktioniert): enter image description here

Wie auch immer, die POST-Antwort 500 mit dem folgenden Fehler:

AssertionError at /api/notes/ 

Kann nicht .is_valid() nennen, da keine data= Das Schlüsselwortargument wurde beim Instanziieren der Serialisierungsinstanz übergeben.

Der Fehler ist der gleiche, wenn ich versuche, es in der Python-Shell zu verwenden.

Antwort

19

Wenn Sie Objekte serialisieren möchten, übergeben Sie das Objekt als erstes Argument.

serializer = CommentSerializer(comment) 
serializer.data 
# {'email': u'[email protected]', 'content': u'foo bar', 'created': datetime.datetime(2012, 8, 22, 16, 20, 9, 822774)} 

Aber wenn man deserialisieren wollen übergeben Sie die Daten mit einem data kwarg.

serializer = CommentSerializer(data=data) 
serializer.is_valid() 
# True 
serializer.validated_data 
# {'content': 'foo bar', 'email': '[email protected]', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)} 

Also in Ihrem Fall, dass Sie Ihre Post-Daten deserialisieren, dafür was Sie tun müssen:

serializer = PatientNoteSerializer(data=request.data) 
+0

Was für ein Tippfehler! Vielen Dank! – ennioma

Verwandte Themen