一、过滤排序
# 请求地址中带过滤条件
# 在视图函数中配置 filter_backends 内置,第三方,自己写
# 继承哪个视图类,才能使用filter_backends,必须继承GenericAPIView及其子类
1、内置过滤使用
from rest_framework.filters import SearchFilter # 导入过滤的模块
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializer.BookSerializer
# 配置过滤类
filter_backends = [SearchFilter, ]
# 配置过滤的字段
search_fields = ['name'] # http://127.0.0.1:8000/books/?search=红 只要是name中带红都会查出来
search_fields=['name','price'] # http://127.0.0.1:8000/books/?search=红 只要是name中或者price中带红都会查出来
2、内置排序使用
from rest_framework.filters import OrderingFilter
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializer.BookSerializer
# 配置排序类
filter_backends = [OrderingFilter, ]
# 配置要排序的字段
# ordering_fields = ['price'] # http://127.0.0.1:8000/books/?ordering=-price 按price降序排列
ordering_fields = ['price','id'] # http://127.0.0.1:8000/books/?ordering=-price,-id 先按price降序排列,如果price一样,再按id的降序排列
3、排序和过滤同时使用
# 既有排序,又有过滤
from rest_framework.filters import SearchFilter, OrderingFilter
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializer.BookSerializer
# 配置过滤和排序类
filter_backends = [SearchFilter,OrderingFilter, ]
# 配置要过滤的字段
search_fields=['name',]
# 配置要排序的字段
ordering_fields = ['price']
# http://127.0.0.1:8000/books/?search=记&ordering=-price 查询名字中带‘记’的并且按价格降序排列
4、第三方过滤类的使用
# http://127.0.0.1:8000/books/?name=红楼梦&price=12
# django-filter--基本使用(更高级,后面项目讲)
# 既然是第三方的,就需要下载:pip install django-filter
# 需要去APP注册
INSTALLED_APPS = [
...
'django_filters', # 需要注册应用,
]
# 视图层
from django_filters.rest_framework import DjangoFilterBackend # 导入第三方过滤模块
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializer.BookSerializer
# 配置第三方过滤类
filter_backends = [DjangoFilterBackend]
# 配置过滤字段
filterset_fields = ['name','price']
# http://127.0.0.1:8000/books/?name=红楼梦&price=228 查询name为红楼梦价格为228的图书
5、自定义过滤类
from rest_framework.filters import BaseFilterBackend
# 自定义过滤类
class MyFilterByPrice(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
# queryset就是要过滤的数据
price = request.query_params.get('price_gt')
if price:
queryset.filter(price__ge=price)
return queryset
# 使用:在视图类里导入自定义过滤类的文件,然后
filter_backends = [MyFilterByPrice]
# 不需要设置过滤字段了,因为在自定义
二、分页
1、自定义分页类
from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination
# 基本分页
class MyPageNumberPagination(PageNumberPagination):
# 重写4个类属性即可
page_size = 2 # 每页显示两条
page_query_param = 'page' # 查询条件 http://127.0.0.1:8000/books/?page=2
page_size_query_param = 'size' # http://127.0.0.1:8000/books/?page=2&size=4 获取第二页数据,返回4条
max_page_size = 5 # http://127.0.0.1:8000/books/?page=2&size=400 获取第二页数据,最多返回5条
# 偏移分页
class MyLimitOffsetPagination(LimitOffsetPagination):
# 4个类属性
default_limit = 2 #每页默认显示多少条
limit_query_param = 'limit' # http://127.0.0.1:8000/books/?limit=3
offset_query_param = 'offset'# http://127.0.0.1:8000/books/?limit=3&offset=1 # 从2位置取3条数据
max_limit = 5 # 限制limit最大条数
# 游标
class MyCursorPagination(CursorPagination):
cursor_query_param = 'cursor' # 查询条件,无用
page_size = 2 # 每页显示多少条
ordering = 'id' # 按谁排序
2、分页类使用
# 在需要使用分页的视图类中添加
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = serializer.BookSerializer
pagination_class = MyPageNumberPagination # 使用分页类