2015-04-19 23 views
9

Mam następujący model:django-rest-ramowa: Nie można wywołać `.is_valid()` `jak żadne dane =` Argument Hasło zostało przekazane podczas uruchamianiu instancji serializer

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) 

i następujący serializatora :

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

Po prostu chcę zrobić POST na PatientNote. Prace GET i POST również w innych modelach działa prawidłowo:

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 jest QueryDict, czyli

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

byłoby w stanie wypełnić dwa FKS, cierpliwy i kategorię , poprzez ich identyfikatory i opis jest prostym tekstem.

Żądanie POST jest następujący jeden (który działa z innymi modelami): enter image description here

Zresztą odpowiedź POST 500 z powodu następującego błędu:

AssertionError at /api/notes/ 

Nie można wywołać .is_valid() jak nie data= Argument słowa kluczowego został przekazany podczas tworzenia instancji serializera.

Błąd jest taki sam, jeśli próbuję go użyć w powłoce Pythona.

Odpowiedz

19

Gdy chcesz serializować obiekty, przekazujesz obiekt jako pierwszy argument.

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

Ale kiedy chcesz deserializowania przekazać dane z 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)} 

Więc w przypadku, gdy chcesz deserializowania swoich danych post, do nich trzeba zrobić:

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

Co literówka! Dziękuję bardzo! – ennioma