Django rest framework使用ModelViewSet视图集

参考:https://www.cnblogs.com/zgboy/p/15097848.html

ModelViewSet

ModelViewSet是封装度最高的DRF的视图类。包含了增删改查中的所有接口操作。

它继承自GenericViewSet、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

使用视图集,可以将一系列逻辑相关的动作放到一个类中:
list() 提供一组数据
retrieve() 提供单个数据(详情)
create() 创建数据
update() 更新数据
destory() 删除数据

小试牛刀

mysite/urls.py

from rest_framework import routers
from rbac.views import user, menu

router = routers.SimpleRouter()
router.register(r'menu', menu.MenuViewSet, basename='menu')
router.register(r'user', user.UserViewSet, basename='user')

urlpatterns = [
    path(r'api/v1/auth/manage/', include(router.urls)),
    path(r'docs/', include_docs_urls(title='星辰', authentication_classes=[],permission_classes=[])),

]
rbac/views/menu.py

class MenuViewSet(ModelViewSet):
    """
    菜单管理:增删改查
    list: 查询
    create: 新增
    """
    queryset = Menu.objects.all()
    serializer_class = MenuSerializer
    pagination_class = MyPagination
    filter_backends = (SearchFilter, OrderingFilter)
    search_fields = ('name',)
    ordering_fields = ('id',)
    authentication_classes = []
    permission_classes = []

    def get_serializer_class(self):
        # if self.action == 'list':
        return MenuSerializer

访问api docs看下效果
在这里插入图片描述

ReadOnlyModelViewSet

ReadOnlyModelViewSet继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin

from rest_framework import viewsets

# 封装请求
class MyResponse(Response):
    @staticmethod
    def success(data, count=0):
        return Response({'data': data, 'meta': {'msg': 'OK', 'status': 200}, 'count': count})

    @staticmethod
    def failed(msg):
        return Response({'data': {}, 'meta': {'msg': msg, 'status': 500}})


class PromViewSet(viewsets.ReadOnlyModelViewSet):
    """
    此视图自动提供`list`和`detail`操作。
    """
    authentication_classes = []
    permission_classes = []

    queryset = PrometheusTemplate.objects.all()
    serializer_class = PrometheusTemplateSerializer

    def list(self, request, *args, **kwargs):
        # permission_classes()
        # authentication_classes()
        # 获取实例
        print(request.query_params)
        if request.query_params.get('query'):
            search_words = request.query_params.get('query').strip()
        else:
            search_words = None
        if search_words is not None:
            # 使用Q对象进行关键字条件查询
            condition = Q(name__icontains=search_words)
            queryset = self.filter_queryset(self.get_queryset().filter(condition).order_by('id'))
        else:
            queryset = self.filter_queryset(self.get_queryset())

        # # 创建对象
        # pg = MyPagination()
        # # 获取分页数据
        # page_query = pg.paginate_queryset(queryset=queryset, request=request, view=self)
        # 序列化数据
        serializer = self.get_serializer(queryset, many=True)

        # page = self.paginate_queryset(queryset)
        # if page is not None:
        #     serializer = self.get_serializer(page, many=True)
        #     return self.get_paginated_response(serializer, many=True)
        # serializer = self.get_serializer(queryset, many=True)
        count = queryset.count()
        return MyResponse.success(serializer.data, count)

    def retrieve(self, request, *args, **kwargs):
        # permission_classes()
        # authentication_classes()
        # 获取实例
        instance = self.get_object()
        # 序列化
        serializer = self.get_serializer(instance)
        return MyResponse.success(serializer.data)

后话:
如果有比较复杂的定制化需求,建议还是直接使用APIView

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值