参考: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