在 Django Rest Framework 中使用 APIView 和 viewset 设置路由器

Posted

技术标签:

【中文标题】在 Django Rest Framework 中使用 APIView 和 viewset 设置路由器【英文标题】:Setting up router with APIView and viewset in Django Rest Framework 【发布时间】:2020-07-22 02:22:38 【问题描述】:

这是我在 *** 上的第一个问题!

我是 Django 新手,正在学习一些教程。

我试图了解是否有办法从不同的视图类(如 APIView 和 viewets.ModelViewSet)设置 API 的路由(如果我没有使用好的措辞,请告诉我)

在我的观点中:

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

在我的网址中:

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

但我似乎可以通过这种方式注册 FileUploadView。因为我没有要呈现的查询集。

我有:AttributeError: type object 'FileUploadView' has no attribute 'get_extra_actions'

我意识到(我认为)我可以将APIView 用于FileUploadView(并添加“.as_view()”)但我认为我还必须使用APIView 重写UniquePostViewSet 并准确定义什么我想详细了解 POST、PUT 等...

我的问题是:有没有办法同时使用DefaultRouterrouter.register 并插入从APIView 继承的视图(以及从viewsets.ModelViewset 继承的视图)?

希望所有这些都清楚,非常感谢您的帮助!!!

【问题讨论】:

【参考方案1】:

这样的事情应该可以工作。

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

【讨论】:

【参考方案2】:

urls.py

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

当视图集中没有查询集属性时会发生这种情况。

【讨论】:

以上是关于在 Django Rest Framework 中使用 APIView 和 viewset 设置路由器的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?