2015-07-03 59 views
1

所以我試圖使用Django Rest Framework。它將用作Ionic混合應用程序的REST API。我需要能夠通過街道名稱參數(基於距離用戶GPS位置最近的街道)從應用發送請求,該請求返回包含該街道名稱的數據。我正在嘗試遵循文檔中的Filtering against the URL指南。Django Rest Framework - 針對URL進行過濾 - TypeError as_view()只需要1個參數(給出3個參數)

我的代碼如下所示:

**urls.py** 
router = DefaultRouter() 
router.register(r'notes', views.NoteView, base_name='notes') 

urlpatterns = patterns('', 
        url(r'^api/', include(router.urls)),namespace='rest_framework')), 
        url('^notes/(?P<location>.+)/$', views.NoteView.as_view()), 
) 

**serializers.py** 
class NoteSerializer(serializers.ModelSerializer): 
    place = serializers.StringRelatedField() 

    class Meta: 
     model = Note 
     fields = ('text_content', 'from_date', 'place') 

**views.py** 
class NoteView(generics.ListAPIView): 
    serializer_class = NoteSerializer 

    def get_queryset(self): 
     location = self.kwargs['location'] 
     wreturn Note.objects.filter(place__name__contains=location) 

我不強的正則表達式,但我想,我需要把在本地主機/ API /筆記/ streetname /查詢API,用於與該資料街道名稱?

什麼情況是,我得到的錯誤:在/ API /筆記/ Vestergade/ as_view 類型錯誤()將(給定3)正好1參數

堆棧跟蹤:

Environment: 

Request Method: GET 
Request URL: http://localhost:8000/api/notes/Vestergade/ 

Django Version: 1.8 
Python Version: 2.7.5 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'rest_framework', 
'api') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    119.     resolver_match = resolver.resolve(request.path_info) 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/django/core/urlresolvers.py" in resolve 
    366.    for pattern in self.url_patterns: 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/django/core/urlresolvers.py" in url_patterns 
    402.   patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/django/core/urlresolvers.py" in urlconf_module 
    396.    self._urlconf_module = import_module(self.urlconf_name) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py" in import_module 
    37.  __import__(name) 
File "/Users/andersravn/Projekter/laverapi/citystoriesapi/citystoriesapi/urls.py" in <module> 
    17.      url(r'^api/', include(router.urls)), 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/rest_framework/routers.py" in urls 
    79.    self._urls = patterns('', *self.get_urls()) 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/rest_framework/routers.py" in get_urls 
    315.   default_urls = super(DefaultRouter, self).get_urls() 
File "/Users/andersravn/Projekter/laverapi/lib/python2.7/site-packages/rest_framework/routers.py" in get_urls 
    256.     view = viewset.as_view(mapping, **route.initkwargs) 

Exception Type: TypeError at /api/notes/Vestergade/ 
Exception Value: as_view() takes exactly 1 argument (3 given) 

我可以似乎沒有弄清楚這三個論點在哪裏給出。

+0

從你的網址中刪除Noteview.as_view(),你已經在路由器中包含了視圖 –

+0

我是否需要從urlpatterns中刪除整行? – Gobias

+0

是的,然後使用django過濾器和rest框架來對照url –

回答

7

在此只是偶然試圖限制我的API的當前用戶的請求。

這是關於視圖的類型:generics.ListAPIView。它不應該是一個視圖,但ViewSet - 檢查這個問題here

更改爲viewsets.ModelViewSet或類似的東西。

+0

真實的答案。謝謝。 – Matt

+0

你是如何實現'list'將支持更新/補丁而不是/ me /(pk)的? –

-1

我注意到了兩件事情,我認爲這可以幫助您解決問題。

  1. 擺脫router.register(r'notes', views.NoteView, base_name='notes')
  2. 無論是在url('^notes/(?P<location>.+)/$', views.NoteView.as_view()),添加/api或簡單地訪問/notes/*LOCATION*
+0

有沒有解決方案可以在不刪除router.register的情況下實現這個功能? – HereHere

+0

你能解釋爲什麼你會有興趣保持重複的網址模式/正則表達式?我的卑微​​建議適用於單個(router.register)行,因爲它是重複的。 你能提供最小的urls.py嗎? –

相關問題