django rest_framework.FilterSet and search

filter 查询过滤

class TestFilter(rest_framework.FilterSet):
    # field_name 是数据库字段
    # lookup_expr  查询模式
    a = rest_framework.CharFilter(field_name='a', lookup_expr='contains')
    b = rest_framework.CharFilter(field_name='b', lookup_expr='contains')
    c = rest_framework.CharFilter(field_name='c', lookup_expr='contains')
    d = rest_framework.CharFilter(field_name='d', lookup_expr='iexact')

    class Meta:
        model = TestModel
        fields = ('a', 'b', 'c', 'd')
  • iexact:表示精确匹配, 并且忽略大小写
  • icontains:表示模糊查询(包含),并且忽略大小写
  • exact:表示精确匹配
  • gte:用于规定范围,大于等于
  • lte: 用于范围,小于等于

分页

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 5,
}

# 可以重写
class BasePageNumberPagination(PageNumberPagination):
    page_query_param = 'current'


class MyPageNumberPagination(BasePageNumberPagination):
    page_size = 10
    page_size_query_param = 'num'
    max_page_size = 50
    ordering = '-create_time'
    pre_count = 0  # 预先已经知道总条数大小

 'DEFAULT_PAGINATION_CLASS': 'xxx.xxx.MyPageNumberPagination',

view

class Test(GenericAPIView):
    queryset = ...
    filter_backends = [DjangoFilterBackend]
    filter_class = TestFilter
    #  模糊查询
    search_fields = ('a', 'v', 'b', 'x', 'aa', 'cc', 'dd')

    def get(self, request):
        """
        测试列表

        :param request:
        :return:
        """

        search_filter = filters.SearchFilter()
        queryset = self.get_queryset()

        search_queryset = search_filter.filter_queryset(request=request, queryset=queryset, view=self)
        filter_queryset = self.filter_queryset(search_queryset)
        return JsonResponse(request, filter_queryset, self.get_serializer)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容