Django Rest Framework - 针对 URL 进行过滤 - TypeError as_view() 恰好需要 1 个参数(给定 3 个)
Django Rest Framework - Filtering against the URL - TypeError as_view() takes exactly 1 argument (3 given)
所以我正在尝试使用 Django Rest Framework。它将充当 Ionic 混合应用程序的 REST API。我需要能够使用街道名称参数(基于距离用户 GPS 位置最近的街道)从应用程序发送请求,其中 return 数据包含该街道名称。我正在尝试遵循文档中的 Filtering against the URL 指南。
我的代码如下所示:
**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)
我不擅长正则表达式,但我想我需要输入 localhost/api/notes/streetname/ 来查询 api 中具有该街道名称的数据?
我得到的错误是:
/api/notes/Vestergade/ 处出现类型错误
as_view() 恰好接受 1 个参数(给定 3 个)
堆栈跟踪:
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)
我似乎无法弄清楚这 3 个参数是在哪里给出的。
我注意到两件事,我认为可以帮助您解决问题。
- 去掉
router.register(r'notes', views.NoteView, base_name='notes')
- 在
url('^notes/(?P<location>.+)/$', views.NoteView.as_view()),
中添加 /api
或直接访问 /notes/*LOCATION*
刚刚偶然发现这个试图限制我的 API 对当前用户的请求。
关于视图类型:generics.ListAPIView
。它不应该是一个视图,而是一个视图集——检查这个问题here
将其更改为 viewsets.ModelViewSet
或类似内容。
所以我正在尝试使用 Django Rest Framework。它将充当 Ionic 混合应用程序的 REST API。我需要能够使用街道名称参数(基于距离用户 GPS 位置最近的街道)从应用程序发送请求,其中 return 数据包含该街道名称。我正在尝试遵循文档中的 Filtering against the URL 指南。
我的代码如下所示:
**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)
我不擅长正则表达式,但我想我需要输入 localhost/api/notes/streetname/ 来查询 api 中具有该街道名称的数据?
我得到的错误是: /api/notes/Vestergade/ 处出现类型错误 as_view() 恰好接受 1 个参数(给定 3 个)
堆栈跟踪:
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)
我似乎无法弄清楚这 3 个参数是在哪里给出的。
我注意到两件事,我认为可以帮助您解决问题。
- 去掉
router.register(r'notes', views.NoteView, base_name='notes')
- 在
url('^notes/(?P<location>.+)/$', views.NoteView.as_view()),
中添加/api
或直接访问/notes/*LOCATION*
刚刚偶然发现这个试图限制我的 API 对当前用户的请求。
关于视图类型:generics.ListAPIView
。它不应该是一个视图,而是一个视图集——检查这个问题here
将其更改为 viewsets.ModelViewSet
或类似内容。