18

Sto seguendo un tutorial situato a here che utilizza Django Rest Framework e continuo a ricevere uno strano errore su un campo.AttributeError durante l'utilizzo di Django Rest Framework con i serializzatori

ho il seguente modello nel mio models.py

from django.db import models 

class Task(models.Model): 
    completed = models.BooleanField(default=False) 
    title = models.CharField(max_length=100) 
    description = models.TextField() 

Poi il mio serializzatore in serializers.py

from rest_framework import serializers 

from task.models import Task 

class TaskSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Task 
     fields = ('title', 'description', 'completed') 

e la mia views.py come segue:

from rest_framework import status 
from rest_framework.decorators import api_view 
from rest_framework.response import Response 

from task.models import Task 
from api.serializers import TaskSerializer 


    @api_view(['GET', 'POST']) 
    def task_list(request): 
     """ 
     List all tasks, or create a new task 
     """ 
     if request.method == 'GET': 
      tasks = Task.objects.all() 
      serializer = TaskSerializer(tasks) 
      return Response(serializer.data) 

     elif request.method == 'POST': 
      serializer = TaskSerializer(data=request.DATA) 
      if serializer.is_valid(): 
       serializer.save() 
       return Response(serializer.data, status=status.HTTP_201_CREATED) 
      else: 
       return Response(
        serializer.errors, status=status.HTTP_400_BAD_REQUEST 
       ) 

e la mia urls.py ha questa riga:

url(r'^tasks/$', 'task_list', name='task_list'), 

Quando provo accede curl http://localhost:9000/api/tasks/, continuo a ricevere il seguente errore e non sono sicuro di cosa fare di esso:

AttributeError at /api/tasks/ 
Got AttributeError when attempting to get a value for field `title` on serializer `TaskSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance. 
Original exception text was: 'QuerySet' object has no attribute 'title'. 

Quello che sto mi manca?

risposta

54

Semplice specificare many=True durante la creazione di un serializzatore dal set di query, TaskSerializer(tasks) funziona solo con un'istanza di Task:

tasks = Task.objects.all() 
serializer = TaskSerializer(tasks, many=True) 
+0

questo ha funzionato per me bene. Grazie. – Frankline

+0

Grazie per questo, in genere ho creato ListSerializer ma ora lo so. Grazie campione. –

+0

Gli angeli hanno un nome .. bloccato in questo dagli ultimi cinque giorni .. –

4

Il problema qui è che si sta tentando di convertire un Queryyset (elenco) di voci in una singola voce. La soluzione è qualcosa in questo senso.

from rest_framework import serializers 

class TaskListSerializer(serializers.ListSerializer): 
    child = TaskSerializer() 
    allow_null = True 
    many = True 

Poi

if request.method == 'GET': 
     tasks = Task.objects.all() 
     serializer = TaskListSerializer(tasks) 
     return Response(serializer.data) 
Problemi correlati