GenericViewSet继承了GenericAPIView,依然有get_queryset,get_serialize_class相关属性与方法,GenericAPIView重写了as_view方法,可以获取到HTTP的请求方法

GenericViewset结合Mixins

编辑blogs目录下的views.py

from rest_framework import mixins, viewsets
from rest_framework.pagination import PageNumberPagination

from .serializers import ArticleSerializer
from .models import Article

class StandardResultsSetPagination(PageNumberPagination):
    page_query_param = 'page'
    page_size = 15
    page_size_query_param = 'page_size'
    max_page_size = 1000

class ArticleListViewset(mixins.ListModelMixin,
                         mixins.CreateModelMixin,
                         viewsets.GenericViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    pagination_class = StandardResultsSetPagination

使用routers绑定地址

1.使用普通方法绑定路由

编辑LehuXuexi目录下的urls.py,新增

from blogs.views import ArticleListViewset

article_list = ArticleListViewset.as_view({'get': 'list', 'post': 'create'})

urlpatterns = [
    ...,
    path('articles/', article_list, name='article-list'),
    ...,
]

2.使用routers注册绑定

为了方便路由管理,可以把所有路由注册到router里面,接下来编辑LehuXuexi目录下的urls.py

from rest_framework.routers import DefaultRouter
from blogs import views as blog_views

router = DefaultRouter()
router.register(r'articles', blog_views.ArticleListViewset, basename='articles_viewset')

urlpatterns = [
    ...,
    #路由集合
    path('', include(router.urls)),
    ...,
]

打开 http://localhost:8000/ 地址可以看到router下所有可调用接口

API的版本管理控制

在实际项目开发中,为了记录接口的迭代,可以用版本号来管理;如果某些接口不是用Viewset实现不能注册到DefaultRouter。为了更好的管理路由新增url管理,LehuXuexi目录的urls.py新增

# 所有V1版的API
api_v1_urls = router.urls + [
    # 文章列表,使用generics.ListCreateAPIView实现的
    path('articles0/', ArticleListView.as_view(), name='article0-list'),
]

urlpatterns = [
    ...,
    #路由集合
    path('api/v1/', include(api_v1_urls)),
]

这样api/v1/不仅可以DefaultRouter的地址还可以放其他方法写的地址

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:http://zhangyanc.club/subject/article/GenericViewSet/

许可协议:署名-非商业性使用 4.0 国际许可协议