簡體   English   中英

Django休息框架自定義過濾器用於POST請求

[英]Django rest framework custom filter for POST request

在filters.py中,我定義了一個CustomFilter ,其值為ComboSortFilterIntegerListFilter

在views.py中,我定義了一個具有filter_class = CustomFilter的ViewSet,這適用於GET請求,使用url中的查詢字符串參數,使用自定義過濾進行處理。

我還需要支持POST請求,因為某些過濾條件太長而無法放入URL。

所以我在我的ViewSet中添加了一個post方法,在那里我從request.DATA提取params,然后對它們進行過濾,序列化和分頁......

在我的ViewSet的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中定義的使用ComboSortFilterIntegerListFilter過濾字段的過濾有點復雜:

在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復制所有這些過濾代碼以使其工作。

關於Django-rest-framework的所有文檔:過濾器只包括在視圖中自行滾動或使用過濾器類的簡單示例。 有沒有辦法直接從視圖中調用過濾器類,覆蓋它通常從查詢字符串中獲取的值?

弄清楚了:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM