ritchbeau
ritchbeau

Reputation: 43

Setting up router with APIView and viewset in Django Rest Framework

It's my first question on Stackoverflow !

I'm new to Django and following some tutorials.

I'm trying to understand if there is a way to set up the routing of an API from different view classes like APIView and viewsets.ModelViewSet (please tell me if I do not use the good wording)

In views I have :

from rest_framework import viewsets
from post.models import UniquePost
from .serializers import UniquePostSerializers
from rest_framework.views import APIView

class UniquePostViewSet(viewsets.ModelViewSet):
    serializer_class = UniquePostSerializers
    queryset = UniquePost.objects.all()

class FileUploadView(APIView):
     some code here but no queryset nor serialized data...and no model

In urls I have :

from post.api.views import UniquePostViewSet
from django.urls import path, include
from rest_framework.routers import DefaultRouter

from post.api.views import FileUploadView

router = DefaultRouter()
router.register('UniquePost', UniquePostViewSet, base_name='uniquepostitem')
router.register('demo', FileUploadView, base_name='file-upload-demo')
urlpatterns = router.urls

But it seems that I can register FileUploadView this way. Because I don't have a queryset to render.

I have : AttributeError: type object 'FileUploadView' has no attribute 'get_extra_actions'

I realized that (well I think) that I can use APIView for FileUploadView (and add ".as_view()) but I think I have to rewrite UniquePostViewSet using APIView as well and defining exactly what I want to see in details like POST, PUT etc...

My question is : Is there a way to use DefaultRouter router.register and insert a view that inherit from APIView (and a view that inherit from viewsets.ModelViewset) at the same time ?

Hope all of this is clear and thank you so much for your help !!!

Upvotes: 3

Views: 4791

Answers (2)

Omar Magdy
Omar Magdy

Reputation: 3283

urls.py

router = routers.DefaultRouter()
router.register(r'users', UsersViewSet, basename ='users')

This happens when there is no queryset attribute in the viewset.

Upvotes: 0

Vishwa Jayaratna
Vishwa Jayaratna

Reputation: 106

Something like this should work.

from post.api.views import UniquePostViewSet
from django.urls import path, include
from rest_framework.routers import DefaultRouter

from post.api.views import FileUploadView

router = DefaultRouter()
router.register('UniquePost', UniquePostViewSet, base_name='uniquepostitem')

urlpatterns = [
    path('demo',FileUploadView.as_view(),name='demo'),  
]

urlpatterns += router.urls

Upvotes: 9

Related Questions