一、介绍

ModelViewSet视图集是一个在Django REST framework中常用的概念,它提供了一组与数据库模型进行交互的视图集类,包含了增删改查(CRUD)中的所有接口操作。具体来说,ModelViewSet视图集继承了GenericViewSet和一些其他的mixin类,如ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin和DestroyModelMixin,从而提供了丰富的功能。
这里我们只需要知道用ModelViewSet视图集即可,拥有排序,查询等一系列功能,所以我们只讲ModelViewSet视图集

二、基于ModelViewSet视图前置配置

以下配置基本上都是一些全局配置,便于后续在视图中不用在重新处理,只需要按照配置直接配置即可。

2.1、DRF中的解析器(类)(来处理后端可以接收的数据类型)
#settings.py文件中
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',     #只能接受application/json数据类型
        'rest_framework.parsers.FormParser',  	# 表单解析器
        'rest_framework.parsers.MultiPartParser'   # 文件上传解析器
    ],
}
2.2、DRF中的渲染器(类)(处理响应在html页面中的展示格式)
#settings.py文件中
# 1、默认的渲染器为JSONRenderer、BrowsableAPIRenderer
# 2、如果前端请求头未指定Accept参数或者指定为application/json,那么会自动返回json格式的数据
# 3、可以在DEFAULT_RENDERER_CLASSES中指定需要使用的渲染器
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
    'rest_framework.renderers.JSONRenderer',  # 负责处理JSON类型的返回
    # 'rest_framework.renderers.BrowsableAPIRenderer',
],
}

我们定义完渲染器后,肯定需要返回我们自己定义的响应数据字段,比如常见的msg,code之类的,所以这里就需要我们自己去定义响应

创建utils文件夹然后创建好base_response.py文件

from rest_framework.response import Response

class ResponseOne(Response):
    """
    不包含分页信息的接口返回,主要用于查询数据
    (1)默认code返回200, 支持指定其他返回码
    """

    def __init__(self, data=[], msg='success', status=None, template_name=None, headers=None, exception=False,
                 content_type=None, code=200):
        std_data = {
            "code": code,
            "msg": msg,
            "data": data
        }
        super().__init__(std_data, status, template_name, headers, exception, content_type)


class ResponseError(Response):
    """
    标准响应错误的返回
    (1) 返回错误原因:ResponseError(msg='xxx')
    (2) 返回指定错误码:ResponseError(code=xxx),默认错误码返回400
    """

    def __init__(self, data=None, msg='error', code=400, status=None, template_name=None, headers=None,
                 exception=False, content_type=None):
        std_data = {
            "code": code,
            "msg": msg,
            "data": data
        }
        super().__init__(std_data, status, template_name, headers, exception, content_type)
2.3、分页引擎全局配置
#settings.py文件中
REST_FRAMEWORK = {
	# 分页引擎
    'DEFAULT_PAGINATION_CLASS': 'utils.base_Engine.MyPageNumberPagination',
}

同在utils文件夹下创建好base_Engine.py文件

class MyPageNumberPagination(PageNumberPagination):
    '''分页引擎'''
    page_size = 10
    page_size_query_param = 'size'
    max_page_size = 100
    invalid_page_message = '无效页码'

    # 重写get_paginated_response,只返回count、results
    def get_paginated_response(self, data):
        response = ResponseOne(data=data,msg='查询成功')
        response.data['count'] = self.page.paginator.count  # 数据总数
        response.data['current_page_num'] = self.page.number  # 当前页码
        response.data['total_pages'] = self.page.paginator.num_pages  # 最大页码
        return response
2.4、过滤器引擎 + 搜索引擎 + 排序引擎
#安装过滤库
pipenv install django_filter
#settings.py文件中
REST_FRAMEWORK = {
	'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',  # django-filter多字段组合过滤
        'rest_framework.filters.SearchFilter',  # 搜索单字段过滤器
        'rest_framework.filters.OrderingFilter',  # 排序过滤器
    ],
2.5、响应数据的时间格式配置
#settings.py文件中
REST_FRAMEWORK = {
    'DATETIME_FORMAT': "%Y-%m-%d %H:%M:%S",  # 时间格式
    'DATE_FORMAT': "%Y-%m-%d",  # 日期格式
    }

三、 ModelViewSet实现增删查改

上面我们谈到ModelViewSet继承GenericAPIView等类,拥有搜索排序等功能,现在我们来一一实现下

3.1、定义一个书籍的ModelViewSet模型,通过请求方法就能实现增删查改功能
#在views.py文件中
from rest_framework.viewsets import ModelViewSet
from djangotest.serializers import BookSerilizer
from test1.models import Book


class BooksViewSet(ModelViewSet):
    """
    list:获取书籍列表数据
    retrieve:获取书籍详情数据
    crate:新增书籍数据
    update:更新书籍信息
    DELETE:删除书籍
    """
    queryset = Book.objects.all()
    serializer_class = BookSerilizer

3.2、调整路由

这里是应用了Django的路由机制,只需要照着填写即可

#在子应用下的urls.py种
from . import views
from rest_framework import routers

router = routers.DefaultRouter()
router.register(r'books', views.BooksViewSet)


urlpatterns = [
    # path('',include(router.urls))
]
urlpatterns += router.urls
  1. List(获取书籍列表数据)
    url就是路由,不需要传递其他的参数,就能获取到列表数据
    在这里插入图片描述
  2. retrieve(获取书籍详情数据)

把你需要查看的数据id,拼接在url上,ModelViewSet视图集和路由会自动帮你处理,注意的是,这里都是用的GET请求,和上面list所使用的请求方式一致

在这里插入图片描述

  1. crate(新增书籍数据)

增加数据的时候,就需要用到post方法,同样,路由会自动帮你处理,只需要填写请求参数,就能实现新增数据的处理

在这里插入图片描述

  1. update(更新书籍信息)

更新数据,就需要用到put方法,然后url上跟上你需要修改的id,加上需要修改的数据,请求,即可完成

在这里插入图片描述

  1. DELETE(删除书籍)

通过DELETE方法+需要删除的id号,删除成功后,会返回状态码204,就代表删除成功,这里暂时不会返回响应体,后期会进行改造处理

在这里插入图片描述
ModelViewSet实现增删查改就是这么的简单,可以先编写代码简单试一下

四、搜索+排序功能实现

在上面我们已经全局定义了搜索查询等配置,那么现在我们就可以直接使用,在REST中要实现这些功能是很简单的

4.1、搜索功能
class BooksViewSet(ModelViewSet):

    search_fields = ['name', 'id']  # 指定单过滤的字段 (模糊查询)

    queryset = Book.objects.all()
    serializer_class = BookSerilizer

使用:

通过search_fields定义了可以通过id或者那么来进行查询,所以我们只需要通过关键字search,然后跟上id 或者nam就可以实现查询功能了

在这里插入图片描述

4.2、搜索功能
class BooksViewSet(ModelViewSet):

    search_fields = ['name', 'id']  # 指定单过滤的字段 (模糊查询)
    ordering_fields = ['id', 'name']  #可以按照id或者name排序

    queryset = Book.objects.all()
    serializer_class = BookSerilizer

使用:

通过关键字ordering来实现,下面id前面加上 ‘-’,代表倒序排列

在这里插入图片描述

这一章中我们讲了ModelViewSet实现增删查改,还讲了排序+搜索功能的实现,还定义了一些公共方法,比如自定义响应数据等等,功能很多,后面还会进行修改和封装,截止到这里,我们已经简单完成了书籍的增删查改。来熟悉我们的REST,接下来会给大家讲一下在Django中,如何去管理和生成我们自己的api文档

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐