ePa*_*oal 1 django rest django-rest-framework
当我尝试使用Django-REST-FRAMEWORK注册2个以上的路由器时,我遇到了问题.请看一下我的例子:
urls.py
from rest_framework import routers
from collaborativeAPP import views
router = routers.DefaultRouter()
router.register(r'get_vocab', views.VocabViewSet)
router.register(r'get_term', views.TermViewSet)
router.register(r'get_discipline', views.DisciplineViewSet)
urlpatterns = patterns(
...
url(r'^service/', include(router.urls))
)
Run Code Online (Sandbox Code Playgroud)
views.py
class VocabViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.all()
serializer_class = VocabSerializer
class TermViewSet(viewsets.ModelViewSet):
queryset = Term.objects.all()
serializer_class = TermSerializer
class DisciplineViewSet(viewsets.ModelViewSet):
queryset = Vocab.objects.filter(kwdGroup=4)
serializer_class = DisciplineSerializer
Run Code Online (Sandbox Code Playgroud)
我的localhost中的结果如下:
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"get_vocab": "http://127.0.0.1:8000/service/get_discipline/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我已经注册了3个路由器期待,他们将展示3个网址为每个方法名(get_vocab
,get_term
,get_discipline
).最终结果是 get_discipline
两次出现并且缺少get_vocab url.
请注意,对于使用不同模型的方法,它可以正常工作,但是在get_discipline和get_vocab的情况下,它们使用相同的模型来创建这个混乱.我应该为每个模型使用视图集吗?如果是这样,如何在视图集中定义不同的方法?
它应该发生以下结果:
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"get_vocab": "http://127.0.0.1:8000/service/get_vocab/",
"get_term": "http://127.0.0.1:8000/service/get_term/",
"get_discipline": "http://127.0.0.1:8000/service/get_discipline/"
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我想我可以注册尽可能多的路由器.每个型号应该有一个路由器?为什么似乎不适用于共享相同模型的视图集?
尝试向每个已注册的视图集显式添加base_name:
router = routers.DefaultRouter()
router.register(r'vocabs', views.VocabViewSet, 'vocabs')
router.register(r'terms', views.TermViewSet, 'terms')
router.register(r'disciplines', views.DisciplineViewSet, 'disciplines')
Run Code Online (Sandbox Code Playgroud)
作为旁注,您应该get_
在网址中排除前缀,因为它不是RESTful.每个URL都应指定资源,而不是资源上的操作.那是什么HTTP动词用于:
GET http://127.0.0.1:8000/service/vocabs/
# or this to create resource
POST http://127.0.0.1:8000/service/vocabs/
...
Run Code Online (Sandbox Code Playgroud)