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

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -