django rest framework 过滤 lim分页
一.过滤
1.首先引用diango 自带的过滤配置
2.导入模块
from django_filters.rest_framework import DjangoFilterBackend from django_filters import rest_framework as filters
3.一种简单的过滤:
class BookView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = (DjangoFilterBackend,) filter_fields = ('title', 'price')
通过在浏览器后面带上?price=100, 就可以精确过滤
自定义过滤
通过自己创建的过滤类来实现自定义过滤
class ProductFilter(filters.FilterSet): # 最小 min_price = filters.NumberFilter(field_name="price", lookup_expr="gte") # 最大 max_price = filters.NumberFilter(field_name="price", lookup_expr="lte") # 包含 name = filters.CharFilter(field_name="title", lookup_expr="icontains") # 通过?字段自定义过滤 class Meta: model = Book fields = ["min_price", "max_price", "name"]
BookViews
class BookView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = (DjangoFilterBackend,) # 自定义过滤类 filter_class = ProductFilter
LimitOffset分页
引入模块
from rest_framework.pagination import LimitOffsetPagination
输入代码
class P1(LimitOffsetPagination): max_limit = 3 default_limit = 2 # 从offset开始访问的下几个 limit_query_param = "limit" # 定义从表中的offset开始计算 offset_query_param = "offset" class IndexView2(APIView): def get(self, request, *args, **kwargs): user_list = Book.objects.all() p1=P1() page_user_list = p1.paginate_queryset(queryset=user_list, request=request, view=self) print("打印的数据", page_user_list) ser = BookSerializer(instance=page_user_list, many=True) # return Response(ser.data) # 自带分页 return p1.get_paginated_response(ser.data) class BookView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer filter_backends = (DjangoFilterBackend,) # 自定义过滤类 filter_class = ProductFilter filter_fields = ('title', 'price') # pagination_class = MyPageNumberPagination # authentication_classes = [UserAuth] # permission_classes = [UserPerm]