可以用自带得分页工具,在settings配置一下就可以了
REST_FRAMEWORK = { #分页 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', #每页显示的个数 'PAGE_SIZE': 10, }
自定义分页:(要继承PageNumPagination【需要引入】)
from rest_framework.pagination import PageNumberPagination
class GoodsPagination(PageNumberPagination): ''' 商品列表自定义分页 ''' #默认每页显示的个数 page_size = 10 #可以动态改变每页显示的个数 page_size_query_param = 'page_size' #页码参数 page_query_param = 'page' #最多能显示多少也 max_page_size = 100
在视图函数里指定:
class GoodlistViewSet(mixins.ListModelMixin,viewsets.GenericViewSet): '商品列表页' queryset = Goods.objects.all().order_by('-id') #指定要获取得查询对象 #分页 pagination_class = GoodsPagination serializer_class = GoodsSerializer #指定要序列化的模型类 filter_backends = (DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter) #指定要过滤的内容,搜索的,排序的 #设置filter的类为我们自定义的类 filter_class = GoodsFilter # 搜索,=name表示精确搜索,也可以使用各种正则表达式 search_fields = ('=name', 'goods_brief') # 排序 ordering_fields = ('sold_num', 'add_time')
fileters.py 指定商品过滤的类
import django_filters from .models import Goods class GoodsFilter(django_filters.rest_framework.FilterSet): ''' 商品过滤的类 ''' #两个参数,name是要过滤的字段,lookup是执行的行为,‘小于等于本店价格’ price_min = django_filters.NumberFilter(field_name="shop_price",lookup_expr='gte') price_max = django_filters.NumberFilter(field_name='shop_price',lookup_expr='lte') class Meta: model = Goods fields = ['price_min','price_max']