18

Tôi đang theo một hướng dẫn nằm ở here sử dụng Django Rest Framework và tôi tiếp tục gặp lỗi lạ về một trường.AttributeError trong khi sử dụng Django Rest Framework với serializers

tôi có mô hình sau đây trong tôi 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() 

Sau đó serializer của tôi trong 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 của tôi như sau:

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 
       ) 

và urls.py tôi có dòng này:

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

Khi tôi cố gắng truy cập vào curl http://localhost:9000/api/tasks/, tôi tiếp tục nhận được lỗi sau và tôi không chắc chắn những gì để làm cho nó:

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

Tôi đang thiếu gì?

Trả lời

54

Simple định many=True khi tạo một serializer từ queryset, TaskSerializer(tasks) sẽ chỉ làm việc với một ví dụ của Task:

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

này làm việc cho tôi nữa. Cảm ơn. – Frankline

+0

Cảm ơn vì điều này, tôi đã thường tạo ListSerializers nhưng bây giờ tôi biết. Cảm ơn nhà vô địch. –

+0

Thiên thần có tên .. bị kẹt trong này từ năm ngày qua .. –

4

Vấn đề ở đây là bạn đang cố gắng chuyển đổi một Queryset (danh sách) các mục nhập thành một mục duy nhất. Giải pháp là một cái gì đó dọc theo những dòng này.

from rest_framework import serializers 

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

Sau đó

if request.method == 'GET': 
     tasks = Task.objects.all() 
     serializer = TaskListSerializer(tasks) 
     return Response(serializer.data) 
Các vấn đề liên quan