Django(七)查询分页及过滤fliters

查询结果分页及通过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参数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值