视图函数定义
from cc_ops_playbook.serializers import * from rest_framework import viewsets from rest_framework import status from rest_framework.response import Response class PlayBookConfigViewSet(viewsets.ModelViewSet): queryset = Playbook.objects.all() serializer_class = PlaybookSer # 重写post方法 def create(self, request, *args, **kwargs): request.data["create_user"] = request.user.id serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
序列化组件
class PlaybookSer(serializers.ModelSerializer): class Meta: model = Playbook fields = "__all__"
入口url使用
from django.urls import path, include from demo.urls import router as router_playbook urlpatterns = [ path('api/v1/playbook/', include(router_playbook.urls)), ]
详细url使用注册的方法。链接到视图函数
from rest_framework import routers from demo.views import PlayBookConfigViewSet router = routers.SimpleRouter() router.register('config', PlayBookConfigViewSet)
接口请求例子
http://127.0.0.1:800/api/v1/playbook/config get 获取所有 http://127.0.0.1:800/api/v1/playbook/config/ get 获取所有 http://127.0.0.1:800/api/v1/playbook/config/1 get 获取id为1的详细信息 http://127.0.0.1:800/api/v1/playbook/config/1/ get 获取id为1的详细信息 http://127.0.0.1:800/api/v1/playbook/config/ post http://127.0.0.1:800/api/v1/playbook/config/1/ delete 删除1的信息 http://127.0.0.1:800/api/v1/playbook/config/1/ put 修改
重写增删改查
from cc_ops_playbook.serializers import * from rest_framework import viewsets from rest_framework import status from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from rest_framework import filters as rest_filter class BaseViewSet(viewsets.ModelViewSet): filter_backends = ( DjangoFilterBackend, rest_filter.SearchFilter, rest_filter.OrderingFilter) class PlayBookConfigViewSet(BaseViewSet): queryset = Playbook.objects.all().order_by('id') serializer_class = PlaybookSer def get_queryset(self): queryset = super(PlayBookConfigViewSet, self).get_queryset() name = self.request.query_params.get('name') if name: queryset = queryset.filter(name__contains=name) return queryset def create(self, request, *args, **kwargs): request.data["create_user"] = request.user.id serializer = self.get_serializer(data=request.data) res = serializer.is_valid(raise_exception=False) if res: self.perform_create(serializer) return Response(data={'code': status.HTTP_200_OK,'message': '创建成功',"data":serializer.data}) else: return Response(data={'code': status.HTTP_400_BAD_REQUEST,'message':serializer.errors}) def update(self, request, *args, **kwargs): if "id" in request.data: request.data.pop("id") if "create_at" in request.data: request.data.pop("create_at") if "update_at" in request.data: request.data.pop("update_at") if "is_deleted" in request.data: request.data.pop("is_deleted") if "create_user" in request.data: request.data.pop("create_user") partial = kwargs.pop('partial', False) instance = self.get_object() serializer = self.get_serializer(instance, data=request.data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None): # If 'prefetch_related' has been applied to a queryset, we need to # forcibly invalidate the prefetch cache on the instance. instance._prefetched_objects_cache = {} return Response(data={'code': status.HTTP_200_OK, 'message': '更新成功', "data": serializer.data}) def destroy(self, request, *args, **kwargs): instance = self.get_object() self.perform_destroy(instance) return Response(data={'code': status.HTTP_200_OK, 'message': '删除成功'})
一、分页的使用
具体某一个模块使用
class ModelViewSetPafination(PageNumberPagination): page_size_query_param = 'page_size' ###获取返回页数 max_page_size = 2 #一页中最多条数 class UserModelViewSte(ModelViewSet): queryset = User.objects.all() #获取所有数据的集合 serializer_class = UserSer1 #所需要用到的序列化器 pagination_class = ModelViewSetPafination #分页的序列化 throttle_classes = (UserRateThrottle,)
详细参数
class MyPageNumberPagination(PageNumberPagination): page_size = 5 # 默认每页显示的多少条记录 page_query_param = 'page' # 默认查询参数名为 page page_size_query_param = 'size' # 前台控制每页显示的最大条数 max_page_size = 20 # 后台控制显示的最大记录条数
二、全局配置
setting全局配置
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 5 # 每页数目 }
三、全局自定义配置
from rest_framework.pagination import PageNumberPagination class GlobalPageNumberPagination(PageNumberPagination): def __init__(self): super(GlobalPageNumberPagination, self).__init__() self.page_size_query_param = 'pagesize' self.max_page_size = 100 # 这个设置很重要 =================================== REST_FRAMEWORK = { ........................ 'DEFAULT_PAGINATION_CLASS': 'utils.core.GlobalPageNumberPagination', 'PAGE_SIZE': 10, }
浙公网安备 33010602011771号