2015-04-19 7 views
9

Sono il seguente modello:django-resto-quadro: Impossibile chiamare `.is_valid()` `come nessun dati =` argomento chiave è stata approvata quando si crea un'istanza dell'istanza serializzatore

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) 

E il seguente serializzatore :

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

Voglio solo fare un POST sul PatientNote. Le opere GET e anche il post su altri modelli funzioni correttamente:

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) 

Il request.data è un QueryDict, vale a dire,

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

Sarebbe in grado di popolare il due FKS, paziente e categoria , attraverso i loro ID e la descrizione è un testo semplice.

La richiesta POST è la seguente (che funziona con altri modelli): enter image description here

In ogni caso, la risposta POST è di 500 con il seguente errore:

AssertionError at /api/notes/ 

Impossibile chiamare .is_valid() come nessuna data= l'argomento parola chiave è stato passato durante l'istanziazione dell'istanza serializer.

L'errore è lo stesso se provo ad usarlo nella shell python.

risposta

19

Quando si desidera serializzare oggetti, si passa oggetto come primo argomento.

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

Ma quando si vuole deserializzare si passa i dati con un 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)} 

Quindi nel tuo caso si desidera deserializzare i dati postali, Perciò quello che dovete fare:

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

Che un errore di battitura! Grazie mille! – ennioma