2015-09-13 23 views
1

我想用django和django rest框架構建一個簡單的REST只讀API。這裏的目標是允許使用兩個簡單的字段進行過濾:名稱和配置。Django其他框架過濾「NoneType不可迭代」

當運行該代碼時,我得到一個「'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 

非常感謝,

+0

?還請發佈全部追溯 – miki725

+0

感謝您的回覆,miki。 我發佈了我的Model類,以便您更好地理解我在這裏做的事情併發布完整的堆棧跟蹤。 你是對的,我應該使用「ConfigViewSet」而不是Component,但無論如何,這不會改變問題(我剛剛嘗試過使用Config)。 – justinlevol

+0

請發佈完整的回溯。你只能從回溯中發佈最後一個堆棧 – miki725

回答

2

好吧,所以它現在似乎工作良好。

我認爲問題出在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部分,它的工作。

+1

是的。你正在做查詢集過濾,這在沒有數據存在時會引發問題。 – miki725

+0

這有幫助。謝謝 – thatzprem

0

過濾你返回不同的模型查詢集`Config`,而不是`Component`時候爲什麼我只是評論下面settings.py中的REST_FRAMEWORK

'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.DjangoFilterBackend', 
    ), 
相關問題