Django-Rest-Framework router register -
i'm having issue when try register more 2 routers using django-rest-framework. please take on example:
urls.py
from rest_framework import routers 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)) )
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
the result in localhost following:
http://localhost:8000/service/
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/" }
as can see have registered 3 routers expecting display 3 urls each methodname(get_vocab
, get_term
, get_discipline
). final result get_discipline
occuring 2 times , get_vocab url missing.
notice methods uses different models works fine, in case of get_discipline , get_vocab use same model create mess. should use viewset each model? if so, how can define different methods in viewset?
it should occur following result:
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/" }
what missing? supposed register many routers want. supposed have 1 router per model? why doesn't seem work viewsets share same model?
try explicitly adding base_name each registered viewset:
router = routers.defaultrouter() router.register(r'vocabs', views.vocabviewset, 'vocabs') router.register(r'terms', views.termviewset, 'terms') router.register(r'disciplines', views.disciplineviewset, 'disciplines')
as side note, should exclude get_
prefix in urls since not restful. each url should specify resource, not action on resource. thats http verbs used for:
get http://127.0.0.1:8000/service/vocabs/ # or create resource post http://127.0.0.1:8000/service/vocabs/ ...
Comments
Post a Comment