Django REST框架:AttributeError: object has no attribute 'serializer'

3
我在使用Django REST API框架进行测试时遇到了一些问题。 我的Mac操作系统版本是10.10.3,Python版本为2.7.6,Django版本为1.6.5,djangorestframework版本为3.1.1。我正在尝试对Django REST框架编写一些测试代码。
我有一个API的虚拟测试视图:
class TestApiView(APIView):
    def get(self, request, format=None):
        return Response(status=status.HTTP_404_NOT_FOUND) 

在我调用它的时候,它能够正常工作:

(venv)bash-3.2# curl -H "Accept: application/json; indent=2" -i --request GET "http://127.0.0.1:8000/api/v1/client/test/"
HTTP/1.0 404 NOT FOUND
Date: Thu, 30 Apr 2015 18:35:09 GMT
Server: WSGIServer/0.1 Python/2.7.6
Vary: Accept, Cookie
Allow: GET, HEAD, OPTIONS

但是当我想对该视图进行测试时,它会引发异常。 我的测试代码:
from rest_framework.test import APIClient

client = APIClient()
print client.get('/api/v1/client/test/', format='json')

这段代码会引发异常:

Internal Server Error: /api/v1/client/test/
Traceback (most recent call last):
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response
    response = response.render()
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/response.py", line 59, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/renderers.py", line 333, in render
    form = data.serializer
AttributeError: 'NoneType' object has no attribute 'serializer'
Traceback (most recent call last):
  File "/Users/user/dev/managerv2/tests.py", line 20, in <module>
    print client.get('/api/v1/client/test/', format='json')
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 160, in get
    response = super(APIClient, self).get(path, data=data, **extra)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 86, in get
    return self.generic('GET', path, **r)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/compat.py", line 222, in generic
    return self.request(**r)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 157, in request
    return super(APIClient, self).request(**kwargs)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 109, in request
    request = super(APIRequestFactory, self).request(**kwargs)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/test/client.py", line 444, in request
    six.reraise(*exc_info)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response
    response = response.render()
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/response.py", line 59, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/renderers.py", line 333, in render
    form = data.serializer
AttributeError: 'NoneType' object has no attribute 'serializer'

我几乎遇到了与基于mixins.ListModelMixin的视图相同的问题 - 它在正常情况下工作,但在测试期间会引发异常。

视图定义:

class ListTestView(mixins.ListModelMixin, generics.GenericAPIView):

    pagination_class = paginators.StandardResultsSetPagination

    def get(self, request, format=None, *args, **kwargs):
        self.serializer_class = TestListSerializer
        self.queryset = Client.objects.all()
        return self.list(request, *args, **kwargs)

如何在测试客户端中调用此视图:

print client.get('/api/v1/client/list/', format='json')

引发此异常:

Internal Server Error: /api/v1/client/list/
Traceback (most recent call last):
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response
    response = response.render()
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/response.py", line 59, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/renderers.py", line 333, in render
    form = data.serializer
AttributeError: 'OrderedDict' object has no attribute 'serializer'
Traceback (most recent call last):
  File "/Users/user/dev/managerv2/tests.py", line 22, in <module>
    print client.get('/api/v1/client/golden_state/list/1/', format='json')
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 160, in get
    response = super(APIClient, self).get(path, data=data, **extra)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 86, in get
    return self.generic('GET', path, **r)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/compat.py", line 222, in generic
    return self.request(**r)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 157, in request
    return super(APIClient, self).request(**kwargs)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/test.py", line 109, in request
    request = super(APIRequestFactory, self).request(**kwargs)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/test/client.py", line 444, in request
    six.reraise(*exc_info)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 137, in get_response
    response = response.render()
  File "/Users/user/dev/venv/lib/python2.7/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/response.py", line 59, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "/Users/user/dev/venv/lib/python2.7/site-packages/rest_framework/renderers.py", line 333, in render
    form = data.serializer
AttributeError: 'OrderedDict' object has no attribute 'serializer'

有什么建议吗?非常感谢!
1个回答

1
放弃打印语句,这样应该可以工作。响应表示似乎假定存在一个序列化程序。

删除打印语句并不会改变任何东西。这不是字符串表示级别的异常。问题已提交:https://github.com/tomchristie/django-rest-framework/issues/2903 - DAlex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接