【问题标题】:DRF JSONRenderer 'ReturnList' object has no attribute 'get'DRF JSONRenderer 'ReturnList' 对象没有属性 'get'
【发布时间】:2019-11-17 05:26:16
【问题描述】:

我正在尝试遵循 Django Rest FrameworkVueJS 的教程,以使它们一起工作。在使用 JSONRenderer render 函数时,现在给我一个问题:

AttributeError: 'ReturnList' object has no attribute 'get'

我的列表视图是:

from rest_framework import status
from rest_framework.generics import ListAPIView, RetrieveAPIView
from rest_framework.permissions import AllowAny
from rest_framework.response import Response
from .models import Cat
from .renderers import CatJSONRenderer
from .serializers import CatSerializer, CatListSerializer
class CatListApiView(ListAPIView):
    model = Cat
    queryset = Cat.objects.all()
    permissions_classes = (AllowAny, )
    renderer_classes = (CatJSONRenderer, )
    serializer_class = CatListSerializer

我的 renderers.py 是:

class CatJSONRenderer(JSONRenderer):
    charset = 'utf-8'
    def render(self, data, media_type=None, renderer_context=None):
        print(data)
        errors = data.get('errors', None)

        if errors is not None:
            return super(CatJSONRenderer, self).render(data)

        return json.dumps({'cats': data})

而Traceback是:

Traceback:

File "/home/ytsejam/.virtualenvs/londonyogavidya/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/home/ytsejam/.virtualenvs/londonyogavidya/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  156.                 response = self.process_exception_by_middleware(e, request)

File "/home/ytsejam/.virtualenvs/londonyogavidya/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  154.                 response = response.render()

File "/home/ytsejam/.virtualenvs/londonyogavidya/lib/python3.7/site-packages/django/template/response.py" in render
  106.             self.content = self.rendered_content

File "/home/ytsejam/.virtualenvs/londonyogavidya/lib/python3.7/site-packages/rest_framework/response.py" in rendered_content
  72.         ret = renderer.render(self.data, accepted_media_type, context)

File "/home/ytsejam/public_html/londoner/yogavidya/apps/cat/renderers.py" in render
  7.         errors = data.get('errors', None)

Exception Type: AttributeError at /api/cats/
Exception Value: 'ReturnList' object has no attribute 'get'

我该如何解决这个问题?谢谢

【问题讨论】:

  • 请显示视图。正如错误所说,看起来data 是 ReturnList 的一个实例,而不是一个字典。
  • json.dumps() 会给你一个字符串。该字符串将没有“get”属性。你试过return {'cats': data}吗?
  • 我尝试了同样的错误。
  • @Rachel 错误发生在该行之前。
  • 错误行发生错误。

标签: django django-rest-framework


【解决方案1】:

我可以通过安装django-rest-framework-json-api. 来解决这个问题,如果有人遇到问题,这会将dict 转换为JSON

【讨论】:

    【解决方案2】:

    这可能不是解决此问题的正确方法,而是或多或少类似于解决方法的建议。我发现如果没有对资源进行分页,它会返回带有类型的 data <class 'rest_framework.utils.serializer_helpers.ReturnList'>renderer 类的render() 方法可处理的实际预期输出是<class 'collections.OrderedDict'>。我所做的是使用资源实现分页,因为分页返回<class 'collections.OrderedDict'>。下面的 sn-p 是我的代码示例,供寻求者审查。

    class CategoryList(MyListCreateAPIView): 
        #without the pagination implementation
        queryset = Category.objects.all()
        serializer_class = CategorySerializer
        ... # for brevity
        renderer_classes = (CategoryJSONRenderer,)
    
    

    初始资源url为http://localhost:8000/categories/

    class CategoryList(MyListCreateAPIView):
        # with pagination implementation
        ... # for brevity
        pagination_class = StandardResultsSetPagination
    
    

    资源 url 现在看起来类似于 http://localhost:8000/categories/?limit=5。 对资源进行分页就可以了。

    整个解决方法的灵感来自@jsenecal 制作的Github comment

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多