Ich verfolge ein Tutorial hier , das Django Rest Framework verwendet, und es wird immer wieder ein seltsamer Fehler in Bezug auf ein Feld angezeigt.
Ich habe das folgende Modell in meinem 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()
Dann mein Serializer 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')
und mein views.py
wie folgt:
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
)
und meine urls.py hat diese Zeile:
url(r'^tasks/$', 'task_list', name='task_list'),
Wenn ich versuche, auf curl http://localhost:9000/api/tasks/
Zuzugreifen, wird immer wieder die folgende Fehlermeldung angezeigt, und ich bin nicht sicher, was ich daraus machen soll:
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'.
Was ich vermisse ich?
Geben Sie einfach many=True
An, wenn Sie einen Serializer aus dem Abfragesatz erstellen. TaskSerializer(tasks)
funktioniert nur mit einer Instanz von Task
:
tasks = Task.objects.all()
serializer = TaskSerializer(tasks, many=True)
Das Problem hierbei ist, dass Sie versuchen, ein Queryset (Liste) von Einträgen in einen einzelnen Eintrag zu konvertieren. Die Lösung ist etwas in diese Richtung.
from rest_framework import serializers
class TaskListSerializer(serializers.ListSerializer):
child = TaskSerializer()
allow_null = True
many = True
Dann
if request.method == 'GET':
tasks = Task.objects.all()
serializer = TaskListSerializer(tasks)
return Response(serializer.data)