将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

Posted

技术标签:

【中文标题】将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError【英文标题】:AttributeError while using Django Rest Framework with serializers 【发布时间】:2015-04-29 21:17:03 【问题描述】:

我正在关注位于 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'.

我错过了什么?

【问题讨论】:

【参考方案1】:

从查询集创建序列化程序时简单指定many=TrueTaskSerializer(tasks) 将仅适用于Task 的一个实例:

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

【讨论】:

感谢您,我通常一直在创建 ListSerializers,但现在我知道了。谢谢冠军。【参考方案2】:

这里的问题是您试图将条目的 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)

【讨论】:

以上是关于将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError的主要内容,如果未能解决你的问题,请参考以下文章

将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

将 Swagger 与 Django Rest Framework 一起使用,我可以在不同字段而不是一个正文中看到 POST 参数吗

Django Rest Framework Serializer的简单使用

python Django Rest_Framework框架 安装与配置(图文并茂版)

python Django Rest_Framework框架 安装与配置(图文并茂版)

Django REST framework 基本组件