DRF的ViewSet和Router

GenericViewSet

例如GenericViewSet继承了ViewSetMixin和generics.GenericAPIView,而里面只有一个pass没有任何代码,如果要使用它,比如在前面的Goods商品的views里使用,因为需要get请求所以还是要另外继承一个ListModelMixin,整个views.py就是下面这样(加了自定义分页):

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

from .serializers import GoodsSerializer
from .models import Goods


class GoodsPagination(PageNumberPagination):
    """自定义分页,用于商品的分页"""
    # 每页多少条记录
    page_size = 10
    # 可以在url参数中使用'page_size='来指定上面那个page_size的值
    page_size_query_param = 'page_size'
    # 这里指定的是分页时,页面url里表明在哪一页的参数名
    page_query_param = 'p'
    max_page_size = 100


class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
    # 设置排序规则,这样才能在分页时没有报错
    queryset = Goods.objects.get_queryset().order_by("goods_sn")
    serializer_class = GoodsSerializer
    pagination_class = GoodsPagination

在urls.py里配置:

from goods.views import GoodsListViewSet

goods_list = GoodsListViewSet.as_view({
    # 在这里配置,GET请求绑定到了list方法上
    'get': 'list',
})

然后在urlpatterns里应用这个配置即可:

path(r'goods/', goods_list, name="goods-list"),

Router

Router带来了另一种注册url的方式,在urls.py里:

from goods.views import GoodsListViewSet
from rest_framework.routers import DefaultRouter

# 配置goods的url
router = DefaultRouter()
router.register(r'goods', GoodsListViewSet)

然后就不需要在urlpatterns里面再注册这个goods了,不过使用了Router一定要在urlpatterns里注册一下这个router对象:

path('', include(router.urls)),

这两个结合起来用就很好用。

posted @ 2019-01-15 22:03  LauZyHou  阅读(621)  评论(0编辑  收藏  举报