查询结果分页及通过django_filters包进行搜索
- 在setting.py文件中加入以下代码:
REST_FRAMEWORK = {
# 分页
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10, #--->每页2条数据
# 设置搜索 --->注意此方法用 pip install djangorestframework==3.4.6安装这个版本才能运行, 新版本已经改了
'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend', 'rest_framework.filters.SearchFilter'),
# 返回结构自定义
'DEFAULT_RENDERER_CLASSES': (
'utils.RenderResponse.CustomJsonRenderer',
)
}
- 在项目文件中建立filters.py文件, 代码如下:
import django_filters
from rest_framework import filters
from stu.models import Student
class StuFilter(filters.FilterSet):
# 从URL获得的name去模型里面进行过滤, 后面的参数是过滤规则, icontains代表模糊匹配,i代表忽略大小写,name是指定变量, 在域名上体现 如:http://localhost:8000/stu/student/?name=刘
name = django_filters.CharFilter('s_name', lookup_expr='icontains')
tel = django_filters.CharFilter('s_tel', lookup_expr='exact') # lookup_expr匹配规则是exact代表精确匹配
status = django_filters.CharFilter('s_status')
operate_time_min = django_filters.DateTimeFilter('s_operate_time', lookup_expr='gte') # 请求的是大于该值的
operate_time_max = django_filters.DateTimeFilter('s_operate_time', lookup_expr='lte') # 请求的是小于该值的, 下同
yuwen_min = django_filters.NumberFilter('s_yuwen', lookup_expr='lte')
yuwen_max = django_filters.NumberFilter('s_yuwen', lookup_expr='gte')
class Meta:
model = Student
fields = ['s_name', 's_tel', 's_operate_time', 's_yuwen'] # 设置过滤的字段
- 在views.py文件中调用该模型, 注意过滤的字段必须经过序列化, 所以序列化的字段里面必须要有该字段.
class StudentsEdit(mixins.ListModelMixin, # -->用于序列化 用于get检索所有信息进行排列
mixins.RetrieveModelMixin, #-->用于get检索 可以根据id进行检索
mixins.UpdateModelMixin, #-->用于patch, put更新
mixins.DestroyModelMixin, #--> 用于delete去删除数据
mixins.CreateModelMixin, #--> 用于post去创建数据
viewsets.GenericViewSet #--->用于去get所有的queryset信息,可以进行过滤,
):
# 查询所有信息
queryset = Student.objects.all() # --->得到一个学生表的全部数据
# 序列化
serializer_class = StudentSerializer # ---> 将serializer_class 赋值为 创建好的序列化Student的序列化模型 StudentSerializer
# 以上的信息是由继承的所有父类的方法自动去调用的, 必须固定写 queryset 和 serializer_class , 否则会出错.
# 过滤
filter_class = StuFilter
# 重新定义排序顺序
def get_queryset(self):
query = self.queryset
return query.order_by('-id')
# 重构了DELETE方法
def destroy(self, request, *args, **kwargs):
instance = self.get_object() #获取当前对象
instance.s_delete = 1
instance.save()
return Response({'msg':'删除成功', 'code':200})
#注意这里的Response应该是从 from rest_framework.response import Response 导入的
- 练习题
两个方式: 后端渲染 , 前后分离 api接口
1) 过滤语文成绩不及格的学生
2) 过滤语文成绩在80到90分之间的学生
3) 过滤留学的学生
4) 过滤修改时间在2018年3月1号
到5月1号的学生
5) 过滤语文成绩在80到90分之间的学生
过滤修改时间在2018年3月1号到5月1号的学生
–rest接口filter参数