8、过滤、排序、分页

一、过滤排序

# 请求地址中带过滤条件
# 在视图函数中配置 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  # 使用分页类
posted @ 2021-09-15 13:23  黑影Poco  阅读(64)  评论(0)    收藏  举报