django rest framework过滤 搜索 排序以及分页


django rest framework过滤 搜索 排序以及分页

简单过滤

直接通过get_queryset简单过滤:

lass GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
     """
     商品详情页
     """
     serializer_class = GoodsSerializer
     #分页
     pagination_class = GoodsPagination

     #接受前端传递的数据
     def get_queryset(self):
         home = self.request.query_params.get('home')
         if not home:
             queryset = SongMenu.objects.all()
         else:
             queryset = SongMenu.objects.all().order_by('colnum')[:1]
         return queryset

DjangoFilterBackend过滤

django-filter库包含一个DjangoFilterBackend类,该类支持REST框架的高度可定制的字段过滤。

1.先安装django-filter

pip install django-filter

2.然后添加django_filters到Django settings的INSTALLED_APPS

INSTALLED_APPS = [
django_filters,
]

3.自定义FilterSet类

from django_filters import rest_framework as df_filters

class GoodsFilter(r_filters.FilterSet):
    """
    过滤器
    """
    min_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='gte', label='最小商品价格')
    max_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='lte', label='最大商品价格')
    top_category = r_filters.NumberFilter(method='top_category_filter')

    def top_category_filter(self, queryset, name, value):
        return queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) |
                               Q(category__parent_category__parent_category_id=value))

    class Meta:
        model = Goods
        fields = ('min_price', 'max_price', 'is_hot', 'is_new')

4.将过滤器后端添加到单个View或ViewSet。

from django_filters.rest_framework import DjangoFilterBackend

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (df_filters.DjangoFilterBackend,)
    filterset_class = GoodsFilter

SearchFilter搜索

SearchFilter级支持简单单的查询参数基于搜索和基于该admin界面的搜索功能

在使用时,可浏览的API将包含一个SearchFilter控件

视图配置search_fields

from rest_framework import filters

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (filters.SearchFilter, )
    search_fields = ('name', "goods_brief", "goods_desc")

这将允许客户端通过查询过滤列表中的项目如:

http://example.com/api/users?search=name

您还可以执行相关的查找ForeignKey或ManyToManyField查找API双下划线符号:

search_fields = ('username', 'email', 'profile__profession')

默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索项,其应该是空格和/或逗号分隔。如果使用多个搜索项,则仅当所有提供的项匹配时,才会在列表中返回对象。

搜索行为可以通过在其中添加各种字符来限制search_fields。

  • '^'开始 - 搜索。
  • '='完全匹配。
  • '@'全文搜索。(目前只支持Django的MySQL后端。)
  • '$'正则表达式搜索。

例如:search_fields = ('=username', '=email')

OrderingFilter排序

OrderingFilter类支持控制结果的排序简单的查询参数。

视图配置ordering_fields

from rest_framework import filters

class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
    """
    商品列表页
    """
    filter_backends = (filters.OrderingFilter, )
    ordering_fields = ('sold_num', 'add_time')

分页

一.分页drf配置信息:

  1.在Lib\site-packages\rest_framework\settings.py中查看:

img

​ 2.简单分页在项目setting中配置:(所有get请求返回数据每页5条)

#每页五条数据
REST_FRAMEWORK={  
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE':5
}

二.定制分页:

[复制代码](javascript:void(0)😉

from rest_framework.pagination import PageNumberPagination
#深度定制分页
from rest_framework.pagination import PageNumberPagination

class PlayListPageNumberPagination(PageNumberPagination):
    """歌单列表数据的分页器"""
    page_query_param = "page"  # 页码参数
    page_size_query_param = 'page_size' # 单页数据量
    page_size = 5   # 默认的单页数据量,就是每一页显示5个课程信息
    max_page_size = 20      # 允许客户端设置的单页数据量


class PlaylistListAPIView(ListAPIView):
    # 初步过滤
    def get_queryset(self):
        home = self.request.query_params.get('home')
        if not home:
            queryset = SongMenu.objects.all()
        else:
            queryset = SongMenu.objects.all().order_by('colnum')[:1]
        return queryset
    serializer_class = SongMenuModelSerializer
    filter_backends = [DjangoFilterBackend, OrderingFilter,SearchFilter]
    # django-filters过滤
    filter_fields = ['tags', ]
    # 搜索
    # http://example.com/api/song/playlist/?search=于   => 止于唇齿 掩于岁月
    # http://example.com/api/song/playlist/?search=古典   => 止于唇齿
    search_fields = ['name','tags__name']
    # 排序
    # ordering_fields = ['id', 'students', 'price']
    # http://example.com/api/song/playlist/?ordering=colnum
    ordering_fields = ['colnum',]
    # 分页
    pagination_class = PlayListPageNumberPagination


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM