Python Django rest框架用于POST请求的自定义筛选器

Python Django rest框架用于POST请求的自定义筛选器,python,django,post,filter,django-rest-framework,Python,Django,Post,Filter,Django Rest Framework,在filters.py中,我定义了一个CustomFilter,其值的类型为ComboSortFilter和IntegerListFilter 在views.py中,我定义了一个具有filter\u class=CustomFilter的视图集,它非常适合GET请求,使用url中的查询字符串参数,这些请求使用自定义筛选进行处理 我还需要支持POST请求,因为有些筛选条件太长,无法放入URL中 因此,我在我的视图集中添加了一个post方法,从request.DATA中提取参数,然后对它们进行过滤、

在filters.py中,我定义了一个
CustomFilter
,其值的类型为
ComboSortFilter
IntegerListFilter

在views.py中,我定义了一个具有
filter\u class=CustomFilter
的视图集,它非常适合
GET
请求,使用url中的查询字符串参数,这些请求使用自定义筛选进行处理

我还需要支持
POST
请求,因为有些筛选条件太长,无法放入URL中

因此,我在我的视图集中添加了一个
post
方法,从
request.DATA
中提取参数,然后对它们进行过滤、序列化和分页

在views.py中我的视图集的post方法中:

queryset = MyModel.objects.filter(**filter_args)
page = self.paginate_queryset(queryset)
serializer = self.get_pagination_serializer(page)
return Response(serializer.data)
对于简单的过滤,上面的方法很好。但是,我在我的
CustomFilter
中定义的过滤,使用
ComboSortFilter
IntegerListFilter
过滤字段,要复杂一些:

在filters.py中:

class IntegerListFilter(django_filters.Filter):
    def filter(self, qs, value):
        if value not in (None, ''):
            integers = [int(v) for v in value.split(',')]
            return qs.filter(**{'{0}__{1}'.format(self.name, self.lookup_type): integers})
        return qs

class ComboSortFilter(django_filters.Filter):
    def __init__(self, threshold, lookup_type, order='ASC'):
        super(ComboSortFilter, self).__init__(lookup_type=lookup_type)
        self.threshold = threshold
        self.order = order

    def filter(self, qs, value):
        if value not in (None, ''):
            fields = [str(v) for v in value.split(',')]
            for field in fields:  # filters each field's values relative to threshold
                qs = qs.filter(**{'{0}__{1}'.format(field, self.lookup_type): self.threshold})
            if self.order == 'DESC':
                fields = ['-{0}'.format(f) for f in fields]
            qs = qs.order_by(*fields)
        return qs

class CustomFilter(django_filters.FilterSet):
    thing_ids = IntegerListFilter(name="thing_id", lookup_type='in')
    sort_desc = ComboSortFilter(lookup_type='gte', threshold=100, order='DESC')
    sort_asc = ComboSortFilter(lookup_type='lte', threshold=100)
是否有任何方法可以从ViewSet的post方法中引用
CustomFilter
FilterSet或我的两个自定义筛选器之一?我不想在
views.py
中复制所有这些过滤代码以使其正常工作

上的所有文档仅包括在视图中滚动或使用筛选器类的简单示例。有没有一种方法可以直接从视图调用筛选器类,覆盖它通常从查询字符串中获取的值?

找到了:

class MyPostViewSet(BaseModelViewSet):

    def post(self, request, *args, **kwargs):
        queryset = self.queryset
        filter_params = request.DATA or request.GET
        if filter_params:
            queryfilter = self.filter_class(filter_params, queryset=queryset)
            queryset = queryfilter.qs
        page = self.paginate_queryset(queryset)
        serializer = self.get_pagination_serializer(page)
        return Response(serializer.data)

使用Django 1.11、DRF 3.9.0:分页不起作用,因为DRF检查
request.query_params
。可以手动设置查询参数,但这需要一个单独的解决方法,如此处所述: