【问题标题】:Django rest framework filtering "NoneType is not iterable"Django rest 框架过滤“NoneType 不可迭代”
【发布时间】:2015-12-09 14:52:28
【问题描述】:

我正在尝试使用 django 构建一个简单的 REST 只读 API,特别是 django rest 框架。这里的目标是允许使用两个简单字段进行过滤:名称和配置。

运行该代码时,我收到“'NoneType' 对象不可迭代”错误。 我想知道我是否应该把这条线:

queryset = Component.objects.all()

因为 get_queryset 方法覆盖了之后。但是我没有写那行,我得到一个“base_name 参数未指定,并且无法从视图集中自动确定名称,因为它没有.queryset 属性。”错误。

这是我的模型:

class Component(models.Model):
    name = models.CharField(max_length=200)

    def configs(self):
        return Config.objects.filter(exchange=self)

    def __unicode__(self):
        return self.name

class Config(models.Model):
    name = models.CharField(max_length=200)
    exchange = models.ForeignKey(Component)

    def sections(self):
        return Section.objects.filter(config=self)

    def __unicode__(self):
        return self.name

class Section(models.Model):
    name = models.CharField(max_length=200)
    config = models.ForeignKey(Config)

    def pairs(self):
        return KeyValues.objects.filter(section=self)

    def __unicode__(self):
        return self.name

class KeyValues(models.Model):
    key = models.CharField(max_length=200)
    value = models.CharField(max_length=999)
    section = models.ForeignKey(Section)

这是我的视图集:

class ComponentViewSet(viewsets.ReadOnlyModelViewSet):
    model = Component
    queryset = Component.objects.all()
    serializer_class = ComponentSerializer
    renderer_classes = (JSONRenderer, )

    def get_queryset(self):
        queryset = Component.objects.all()
        name_component = self.request.query_params.get('name', None)
        name_cfg = self.request.query_params.get('name_cfg', None)

        if name_component is not None and name_cfg is not None:
            queryset = Config.objects.filter(exchange=Component.objects.filter(name=name_component), name=name_cfg)

        return queryset

请告诉我我在这里做错了什么?

编辑:

这是完整的堆栈跟踪:

TypeError at /components/

'NoneType' object is not iterable

Request Method:     GET
Request URL:    http://127.0.0.1:8000/components/?name=Coinbase
Django Version:     1.8.3
Exception Type:     TypeError
Exception Value:    

'NoneType' object is not iterable

Exception Location:     /usr/local/lib/python2.7/dist-packages/rest_framework/filters.py in filter_queryset, line 107
Python Executable:  /usr/bin/python2.7
Python Version:     2.7.9
Python Path:    

['/home/flavio/git/web_prncpss',
 '/home/flavio/Downloads/pycharm-4.5.3/helpers/pydev',
 '/usr/local/lib/python2.7/dist-packages/pusherclient-0.3.0-py2.7.egg',
 '/usr/lib/python2.7/dist-packages',
 '/home/flavio/git/web_prncpss',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/pymodules/python2.7',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']

Server time:    Sun, 13 Sep 2015 14:53:57 +0000

编辑 2:

完整回溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/configs/?name=Coinbase&name_cfg=MMConfig

Django Version: 1.8.3
Python Version: 2.7.9
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'nested_admin',
 'accounting',
 'configs',
 'rest_framework')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/viewsets.py" in view
  87.             return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  466.             response = self.handle_exception(exc)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch
  463.             response = handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/mixins.py" in list
  40.         queryset = self.filter_queryset(self.get_queryset())
File "/usr/local/lib/python2.7/dist-packages/rest_framework/generics.py" in filter_queryset
  151.             queryset = backend().filter_queryset(self.request, queryset, self)
File "/usr/local/lib/python2.7/dist-packages/rest_framework/filters.py" in filter_queryset
  107.             for search_field in search_fields

Exception Type: TypeError at /configs/
Exception Value: 'NoneType' object is not iterable

非常感谢,

【问题讨论】:

  • 为什么在过滤时返回不同的模型查询集 Config 而不是 Component?也请发布完整的回溯
  • 感谢您的回复,三木。我发布了我的模型类,以便您更好地了解我在这里所做的事情并发布了完整的堆栈跟踪。不过你是对的,我应该使用“ConfigViewSet”而不是 Component 但无论如何,这并没有改变问题(我只是尝试使用 Config)。
  • 请发布完整的回溯。您只发布了追溯的最后一个堆栈
  • 你去。谢谢

标签: django api rest filtering django-rest-framework


【解决方案1】:

好的,现在看来运行良好。

我认为问题出在 settings.py 文件上。我以前有这个:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.AllowAny',
    ),
    'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter'),
}

我刚刚删除了 FILTER_BACKENDS 部分,它起作用了。

【讨论】:

  • 是的。您正在执行查询集过滤,当没有数据存在时会导致问题。
【解决方案2】:

我刚刚在 settings.py 中为 REST_FRAMEWORK 评论了以下内容

  'DEFAULT_FILTER_BACKENDS': (
        'rest_framework.filters.DjangoFilterBackend',
    ),

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2017-05-03
    • 2012-12-24
    • 2017-05-27
    • 2021-11-09
    • 2014-02-17
    • 2020-10-14
    • 2021-06-19
    • 2021-11-30
    相关资源
    最近更新 更多