drf---过滤/排序/分页

1. 过滤

1.1 安装

pip3 install django-filter

1.2 注册

INSTALLED_APPS = [
   
    'django_filters',

]

1.3 使用

1.3.1 全局使用

1.3.1.1 settings配置

REST_FRAMEWORK = {

    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

1.3.1.2 视图使用

class StudentListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    filter_fields = ('age', 'sex')

# 127.0.0.1:8000/four/students/?sex=1

1.3.2 局部使用

1.3.2.1 视图·

# 第一步导包过滤
from django_filters.rest_framework import DjangoFilterBackend

class CourseListAPIView(ListAPIView):
    """课程列表"""
    queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
    serializer_class = CourseListModelSerializer
    # 第二步 配置
    filter_backends = [DjangoFilterBackend, ]
    # 设置过滤的关键字段 ?course_category=1
    filter_fields = ('course_category',)

2. 排序

2.1 局部使用

from rest_framework.filters import OrderingFilter
class Students7View(ModelViewSet):
    queryset = models.Student.objects.all()  # 必须写这个参数 ,方法中使用的self.get_queryset()方法自动获取到queryset属性数据
    serializer_class = StudentModelSerializer  # 非必填属性,self.get_serializer获取到serializer_class制定的序列化器类
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'age')
    # students/?ordering=-id

# 127.0.0.1:8000/books/?ordering=-age 
# 必须是ordering=某个值
# -id 表示针对id字段进行倒序排序
# id  表示针对id字段进行升序排序

3. 过滤+排序

# 过滤
from django_filters.rest_framework import DjangoFilterBackend #需要使用一下它才能结合使用
# 排序
from rest_framework.filters import OrderingFilter
class Student3ListView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    
    # 因为filter_backends是局部过滤配置,局部配置会覆盖全局配置,所以需要重新把过滤组件核心类再次声明,
    # 否则过滤功能会失效
    filter_backends = [OrderingFilter,DjangoFilterBackend]
    filter_fields = ('age', 'sex')
    ordering_fields = ('id', 'age')
    
# 127.0.0.1:8000/books/?sex=1&ordering=-age 

4.分页

4.1 PageNumberPagination

# 分页
from rest_framework.pagination import PageNumberPagination


class CustomPagenation(PageNumberPagination):
    page_size = 5  # 每页显示的个数
    page_query_param = 'page'  # 查询参数 ?page=3
    page_size_query_param = 'size'  # 前端自定义查询的数量,?size=10
    max_page_size = 100  # 前端自定义显示的字段条数的最大限制


class CourseListAPIView(ListAPIView):
    """课程列表"""
    queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
    serializer_class = CourseListModelSerializer

    pagination_class = CustomPagenation


GET  http://127.0.0.1:8000/students/?page=4

4.2  LimitOffsetPagination

from rest_framework.pagination import LimitOffsetPagination
class StandardLimitOffsetPagination(LimitOffsetPagination):
    # 默认每一页查询的数据量,类似上面的page_size
    default_limit = 2
    limit_query_param = "size"
    offset_query_param = "start"

class StudentAPIView(ListAPIView):
    queryset = Student.objects.all()
    serializer_class = StudentModelSerializer
    # 调用查询偏移分页类
    pagination_class = StandardLimitOffsetPagination

GET http://127.0.0.1/four/students/?limit=100&offset=400  #从下标为400的记录开始,取100条记录


可以在子类中定义的属性:

- default_limit 默认限制,每页数据量大小,默认值与`PAGE_SIZE`设置一致
- limit_query_param limit参数名,默认'limit' , 可以通过这个参数来改名字
- offset_query_param offset参数名,默认'offset' ,可以通过这个参数来改名字
- max_limit 最大limit限制,默认None, 无限制

5. 过滤&分页&排序使用

5.1 过滤安装

pip3 install django-filter

5.2 过滤注册

INSTALLED_APPS = [
   
    'django_filters',

]

5.3 使用

# 过滤
from django_filters.rest_framework import DjangoFilterBackend
# 分页
from rest_framework.pagination import PageNumberPagination
# 排序
from rest_framework.filters import OrderingFilter


class CustomPagenation(PageNumberPagination):
    page_size = 5  # 每页显示的个数
    page_query_param = 'page'  # 查询参数 ?page=3
    page_size_query_param = 'size'  # 前端自定义查询的数量,?size=10
    max_page_size = 100  # 前端自定义显示的字段条数的最大限制


class CourseListAPIView(ListAPIView):
    """课程列表"""
    queryset = models.Course.objects.filter(is_deleted=False, is_show=True).order_by('orders')
    serializer_class = CourseListModelSerializer
    # 配置
    filter_backends = [OrderingFilter, DjangoFilterBackend]
    # 字段设置
    filter_fields = ('course_category',)
    ordering_fields = ('id', 'age')
    pagination_class = CustomPagenation

    # 路由
    # 127.0.0.1:8000/books/?page=1&course_category=1&ordering=-id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪去兜风z1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值