Django Rest Framework Routers with multiple viewsets -
i attempting create api using drf 3.1. started creating manangement functions using modelviewset , registering these defaultrouter. worked , default api root view generated appropriate links when viewed in browser. created more restricted viewsets standard users using readonlymodelviewset, problem occurred when tried register these restricted viewsets router readonlymodelviewsets appear overwrite links on api root view. generated urls appear work when typed browser links on api root view not expected
serializers.py
class adminunitserializer(serializers.hyperlinkedmodelserializer): ''' model serializer admin users containing fields ''' url = hyperlinkedidentityfield(view_name='unit-detail') class meta: model = unit fields = ('url', 'id', 'name', 'symbol', 'converters_from', 'converters_to') class userunitserializer(serializers.hyperlinkedmodelserializer): ''' model serializer standard users containing restricted set of fields ''' url = hyperlinkedidentityfield(view_name='unit-detail') class meta: model = unit fields = ('url', 'id', 'name', 'symbol')
views.py
class adminunitviewset(viewsets.modelviewset): ''' simple viewset providing crud operations on unit objects ''' queryset = models.unit.objects.all() serializer_class = serializers.adminunitserializer permission_classes = (permissions.isadminuser,) class userunitviewset(viewsets.readonlymodelviewset): ''' read view set providing list , detail views unit objects ''' queryset = models.unit.objects.all() serializer_class = serializers.userunitserializer permission_classes(permissions.isauthenticated,)
urls.py
router.register(r'manangeunits', views.adminunitviewset) router.register(r'readunits', views.userunitviewset) urlpatterns = [ url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^rest-auth/', include('rest_auth.urls')), url(r'^', include(router.urls)) ]
this produces default api root view this
{ "manangeunits": "http://localhost:8000/readunits/", "readunits": "http://localhost:8000/readunits/", }
while looking this
{ "manangeunits": "htt://localhost:8000/manageunits/", "readunits": "htt://localhost:8000/readunits/", }
the url 'htt://localhost:8000/manageunits/' valid , accessible when address typed browser not appear on api root view
any appreciated
i had same issue , luckily found solution.
extend urls.py following:
router.register(r'manangeunits', views.adminunitviewset, base_name='manangeunits') router.register(r'readunits', views.userunitviewset, base_name='readunits')
i don't know magic behind this, works me :)
Comments
Post a Comment