DRF-Django rest framework
1. 自定制过滤器
查询所有才会有过滤
==> list才需要过滤
==> queryset = self.filter_queryset(self.get_queryset())
==> GenericAPIView
==> filter_queryset
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
1. 写一个类MyFilter,继承BaseFilterBackend
2. 重写filter_queryset方法,在该方法内部进行过滤(自己设置的过滤条件)
3. 返回queryset对象(过滤后的queryset对象)
4. 配置在视图类中
filter_backends = [MyFilter,]
2. 分页器Pagination
1. 分页介绍
1. 内置了三种分页器
1. PageNumberPagination 普通分页
2. LimitOffsetPagination 偏移分页
3. CursorPagination 游标分页
2. 分页模式
1. APIView
2. GenericAPIView + ListModelMixin
3. 分页器使用
1. 一个视图函数只能使用一个分页器
2. 如果在视图内关闭分页功能,只需在视图内设置 pagination_class = None
2. 可选分页器
1. PageNumberPagination
GET http://127.0.0.1:8000/students/?page=4&size=3
page_size 每页数目
page_query_param 前端发送的页数关键字名,默认为”page”
page_size_query_param 前端发送的每页数目关键字名,默认为None
max_page_size 前端最多能设置的每页数量
page_size = api_settings.PAGE_SIZE
page_query_param = 'page'
page_size_query_param = size
max_page_size = 10
1. 定义一个类,继承PageNumberPagination
2. 重写四个属性
3. 在继承了GenericAPIView + ListModelMixin视图类中配置
pagination_class = MyPageNumberPagination
4. 查询
http://127.0.0.1:8000/students/?page=1&size=5
class MyPageNumberPagination(PageNumberPagination):
page_size = 3
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 5
class StudentView(GenericViewSet,ListModelMixin):
queryset = Student.objects.all()
serializer_class = StudentSerializer
pagination_class = MyPageNumberPagination
2. LimitOffsetPagination
GET http://127.0.0.1/four/students/?limit=100&offset=400
default_limit 默认限制,默认值与PAGE_SIZE设置一直
limit_query_param limit 参数名,默认’limit’
offset_query_param offset 参数名,默认’offset’
max_limit 最大limit限制,默认None
default_limit = ap