18

Я следую учебнику, расположенному here, который использует Django Rest Framework, и я продолжаю получать странную ошибку о поле.AttributeError при использовании Django Rest Framework с сериализаторами

У меня есть следующая модель в моей 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() 

Тогда мой сериализатору в serializers.py

from rest_framework import serializers 

from task.models import Task 

class TaskSerializer(serializers.ModelSerializer): 

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

и мои views.py следующим образом:

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 
       ) 

и мой urls.py имеет эта строка:

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

При попытке доступа к curl http://localhost:9000/api/tasks/, я получаю следующее сообщение об ошибке, и я не уверен, что сделать из него:

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'. 

Что я не хватает?

ответ

54

Простой указать many=True при создании сериалайзер из QuerySet, TaskSerializer(tasks) будет работать только с одним экземпляром Task:

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

Это работает для меня хорошо. Благодарю. – Frankline

+0

Спасибо за это, я вообще создавал ListSerializers, но теперь знаю. Спасибо, чемпион. –

+0

Ангелы имеют имя .. застряли в этом за последние пять дней .. –

4

Проблема заключается в том, что вы пытаетесь преобразовать Queryset (список) записей в одну запись. Решение - это нечто подобное.

from rest_framework import serializers 

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

Тогда

if request.method == 'GET': 
     tasks = Task.objects.all() 
     serializer = TaskListSerializer(tasks) 
     return Response(serializer.data) 
Смежные вопросы