首页 > 解决方案 > Django REST Framework:尝试获取序列化程序上的字段值时出现AttributeError

问题描述

我在尝试更正以下错误时遇到问题: AttributeError at /api/v1/tasks/queue/ Got AttributeError when trying to get a value for field start_aton serializer TaskSerializer。序列化器字段可能命名不正确,并且与bytes实例上的任何属性或键都不匹配。原始异常文本是:“bytes”对象没有属性“start_at”。

当我向 API 任务/队列发送请求时发生错误,我遇到 500 内部服务器错误。

我已经尝试过 StackOverflow 上针对类似问题提出的几种解决方案,包括更改字段和序列化程序,但无济于事。

下面贴出相关的代码片段:

序列化程序.py


class TaskSerializer(serializers.ModelSerializer):
    start_at = serializers.DateField(format=settings.api_settings.DATE_FORMAT)

    class Meta:
        model = Task
        fields = '__all__'
        depth = 2

视图.py


class TaskQueue(generics.ListCreateAPIView):
    serializer_class = TaskSerializer

    def get_queryset(self):
        queryset = Task.objects.all()
        update_histogram()
        role = self.request.query_params.get('role', None)
        user = self.request.user
        if authorization(user,1) and role in ['camp', 'prod']:
            if Task.objects.filter(status='todo', service__role=role).exclude(service__type='incident').count() <= 1:
                return Task.objects.filter(status='todo', service__role=role).exclude(service__type='incident')
            else:
                queue = queryset.filter(status='todo', previous_task__isnull=True, next_task__isnull=False, service__role=role).exclude(service__type='incident')
                node = queue
                while node.first().next_task:
                    node = Task.objects.filter(previous_task=node.first())
                    queue = queue | node
                return queue
        else:
            return HttpResponse(status=404)

预期的输出是一个带有对象的 json,但我得到了一个错误 500。

任何帮助将不胜感激。

标签: pythondjango-rest-framework

解决方案


TaskQueue.get_queryset方法返回一个HttpResponse.

View.get_queryset当被覆盖时必须返回一个QuerySet并且没有其他对象。

为了将未经授权的请求解析为 404,请返回空QuerySet值或使用权限类将此检查上移。

class TaskQueue(generics.ListCreateAPIView):
    serializer_class = TaskSerializer

    def get_queryset(self):
        # ...
        if authorization(user,1) and role in ['camp', 'prod']:
            #...
        else:
            return Task.objects.none()

推荐阅读