【问题标题】:AttributeError 'list' object has no attribute 'get'AttributeError 'list' 对象没有属性 'get'
【发布时间】:2014-09-08 21:38:45
【问题描述】:

使用 format=json 查询我的 API 时,我收到以下错误:

AttributeError 'list' object has no attribute 'get'

有趣的是,Django Rest Framework API UI 不会发生这种情况。仅当format=json

这是我的列表方法:

def list(self, request):
    queryset = dataset_models.DataSet.objects.all()
    serializer = serializers.DataSetListSerializer(queryset, many=True)
    return Response(serializer.data)

还有我的序列化器:

class DataSetListSerializer(serializers.ModelSerializer):
    class Meta:
        model = dataset_models.DataSet

追溯:

Traceback:
File "/usr/lib/python2.7/site-packages/Django-1.5.7.example1-py2.7.egg/django/core/handlers/base.py" in get_response
  187.                 response = middleware_method(request, response)

Exception Type: AttributeError at /api/v0/a-cb4be7e8/p/example.com/dataset/
Exception Value: 'list' object has no attribute 'get'

什么给了?

【问题讨论】:

  • 什么是full回溯?您可能不应该为您的函数使用名称 list,因为它掩盖了内置类型。但是,您的异常中的对象是实际的 list type
  • @MartijnPieters 我的想法完全正确,但根据DRF docs list 是该请求的预期方法。在我的情况下,我将覆盖 list。添加了回溯。
  • 对;因为方法是命名空间的,应该没问题。
  • 不过,这是一个非常短的回溯,除了异常之外没有任何可见的相关性。

标签: python json django django-rest-framework


【解决方案1】:

当您使用many=True 时,它会序列化多个对象并将它们放入一个列表中。由于 JSONResponse 类期望传递一个字典(除非也传递了 safe=False),我猜你的 Response 类也是如此。

【讨论】:

  • 我又看了Response 类。它只是SimpleTemplateResponse 的子类。但是,我确实在documentation 中注意到,如果通过内容协商正确确定,则应该自动设置content_type 参数。换句话说,内容协商中的某些内容似乎已关闭,因为如果我通过 content_type 它可以工作。
  • 我记得你可以完美地将列表传递给 DRF 中的响应类。
  • 看来你应该能够做到。测试传递给Response 的列表是否是异常中被抱怨的列表的一种简单方法是将其设为字典并查看会发生什么。例如。 Response(dict(enumerate(serializer.data)))
  • @RossRidge 传递 dict 工作正常。类似Response({'data': serializer.data})
  • 你有没有运气尝试获得完整的追溯?在你的 Django 设置中完成了明显的设置 DEBUG=True 吗?我认为我们需要完整的回溯来弄清楚为什么它不适用于列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 2023-04-09
  • 2016-01-30
  • 2020-12-15
  • 2016-04-15
相关资源
最近更新 更多