web-dev-qa-db-ja.com

Django Restizer with serializersを使用中のAttributeError

here を使用するチュートリアルに従っています 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'.

私は何が欠けていますか?

29
Frankline

クエリセットからシリアライザーを作成するときに、単純に__many=True_を指定すると、TaskSerializer(tasks)Taskの1つのインスタンスでのみ機能します。

_tasks = Task.objects.all()
serializer = TaskSerializer(tasks, many=True)
_
75

ここでの問題は、エントリのQueryset(list)を単一のエントリに変換しようとしていることです。解決策はこれらの線に沿ったものです。

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)
4
Rodney Hawkins