视图函数定义

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': '删除成功'})
View Code

 一、分页的使用

具体某一个模块使用

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,

}

 

posted on 2021-09-07 18:58  可口_可乐  阅读(2686)  评论(0)    收藏  举报