自动化测试平台搭建(五):ModelViewSet视图集基础使用
一、介绍
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
- List(获取书籍列表数据)
url就是路由,不需要传递其他的参数,就能获取到列表数据

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

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

- update(更新书籍信息)
更新数据,就需要用到put方法,然后url上跟上你需要修改的id,加上需要修改的数据,请求,即可完成

- 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文档
更多推荐
所有评论(0)