目录
- drf --- 分页,过滤,排序组件
- drf --- 分页组件
- 过滤
- 自定义
- 分类与区间
drf --- 分页,过滤,排序组件
drf --- 分页组件
1.系统
1.定义一个类,继承ListModelMixin, GenericViewSet视图类
2.定义queryset对象和serializer_class
3.自定义分页类组件的参数,走自定义的分页组件
view.py中
from rest_framework import pagination # 自带的分页组件
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
serializer_class = serializers.CourseModelSerializer
# 自定义分页类组件参数
pagination_class = pagination.PageNumberPagination
pagination.PageNumberPagination.page_size = 2
2.自定义
1.新建一个文件夹,重新定义PageNumberPagination类,继承pagination.PageNumberPagination
2.配置自定义的关键字参数
3.在view.py的视图中调用该类,让该对象在进行分页的时候走自定义的分页类
paginations.py中
from rest_framework import pagination
# 基础分页
class PageNumberPagination(pagination.PageNumberPagination):
# 默认一页显示的条数
page_size = 2
# 查询页面的关键字
page_query_param = 'page'
# 用户自定义一页显示条数的关键字
page_size_query_param = 'page_size'
# 用户最大可自定义一页显示的条数
max_page_size = 2
view.py中
# 走自定义分页类
pagination_class = paginations.PageNumberPagination
3.偏移分页(了解)
没有固定的第一页是从第几条开始的,可以从中间的某一条开始往后显示
偏移分页与自定义分页一致,不同点在于在自定义的paginations.py的文件中使用的类不一致
class LimitOffsetPagination(pagination.LimitOffsetPagination):
# 默认一页显示的条数
default_limit = 2
# 用户自定义一页显示的条数
limit_query_param = 'limit' # 在url中定义显示几条
# 用户自定义偏移的条数
offset_query_param = 'offset' # 在url中表明偏移几条
# 用户最大可自定义一页显示的条数
max_limit = 2
注意
# 配置某一个分页类即可
pagination_class = paginations.PageNumberPagination
# 注:接口分页前后,response的格式不一样
# 分页前:数据是response.data
# 分页后:数据是response.data.results
过滤
群查过滤
对提供的信息进行全文搜索过滤
view.py中
from rest_framework.filters import SearchFilter,OrderingFilter # 搜索组件
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
serializer_class = serializers.CourseModelSerializer
# 配置搜索组件,调用[ ]中的类进行排序
filter_backends = [SearchFilter]
# 配置参与搜索字段,[ ]内是或的关系,参与全文搜索的字段必须都是数据库表字段
search_fields = ['name']
群查过滤排序
from rest_framework.filters import OrderingFilter
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
serializer_class = serializers.CourseModelSerializer
# 配置排序组件,调用[ ]中的类进行排序
filter_backends = [OrderingFilter]
# 配置参与排序字段
ordering_fields = ['price', 'id', 'students']
# 规则:
# ?ordering=price 按价格升序
# ?ordering=-price 按价格降序
# ?ordering=id 按主键升序
# ?ordering=-price,id 按价格降序,价格相同时按主键升序
自定义
自定义过滤类:filters.py
# 自定义过滤器:自定义普通类,实现filter_queryset可以接受request, queryset, view返回过滤处理后的queryset即可
class MyFilter:
def filter_queryset(self, request, queryset, view):
# 过滤条件是死的,?count=数字,也可以写高级一点,从view中去反射配置信息,或者将配置信息放在settings中
count = request.query_params.get('count', None)
if not count:
return queryset # 没过滤
try:
count = int(count)
return queryset[:count] # 过滤
except:
return queryset # 没过滤
群查接口的视图类:views.py
from .filters import MyFilter
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
serializer_class = serializers.CourseModelSerializer
# 配置排序组件
filter_backends = [MyFilter]
分类与区间
安装django-filter插件
>: pip install django-filter
自定义过滤规则类:filters.py
from django_filters import filters
from . import models
class CourseFilterSet(FilterSet):
# 实现区间:field_name关联model表属性,lookup_expr设置过滤规则
min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
class Meta:
model = models.Course
# min_price 和 max_price 自定义规则字段可以不在fields中配置
fields = ['course_category']
群查接口的视图类:views.py
from django_filters.rest_framework import DjangoFilterBackend
from .filters import CourseFilterSet
class FreeCourseListViewSet(ListModelMixin, GenericViewSet):
queryset = models.Course.objects.filter(is_delete=False, is_show=True).all()
serializer_class = serializers.CourseModelSerializer
# 配置过滤组件
filter_backends = [DjangoFilterBackend]
# 配置过滤规则的类
filter_class = CourseFilterSet
# 规则:
# ?course_category=1 课程分组1所有的课程
# ?min_price=10 课程价格大于等于10的所有课程
# ?min_price=10&max_price=100 课程价格大于等于10小于等于100的所有课程