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)),
这两个结合起来用就很好用。