Django-Rest-Framework路由器寄存器

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://本地主机:8000 /服务/

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)

我错过了什么?我想我可以注册尽可能多的路由器.每个型号应该有一个路由器?为什么似乎不适用于共享相同模型的视图集?

mik*_*725 7

尝试向每个已注册的视图集显式添加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)