使用DjangoFilterBackend进行自定义搜索

时间:2018-04-22 07:53:19

标签: django django-rest-framework django-filter

我想再搜索多列。我为此目的使用了DjangoFilterBackend。这个包使用

http://localhost:8000/api/v1/contacts/?first_name=Clair&last_name=Test

我想将此模式自定义为

http://localhost:8000/api/v1/contacts/?query[first_name]=Clair&query[last_name]=Test

如何自定义DjangoFilterBackend?

提前致谢。

1 个答案:

答案 0 :(得分:0)

这是一个黑客;但是如果需要,可以创建支持此URL方案的自定义BaseFilterSet。您需要从查询格式转换为FilterSet期望的字段格式;意思是将query[first_name]更改为first_name

这样的事可能有用:

import re

from django_filters.filterset import BaseFilterSet


class CustomParamFilterSet(BaseFilterSet):
    PARAM_REGEX = 'query\[(\w+)\]'

    def __init__(self, data=None, queryset=None, prefix=None, strict=None, request=None):
        d = self.translate_data(data)
        super(CustomParamFilterSet, self).__init__(d, queryset, prefix, strict, request)

    @classmethod
    def translate_data(cls, data):
        regexp = re.compile(cls.PARAM_REGEX)
        d = dict()

        for k, v in data.iteritems():
            match = regexp.match(k)
            if match:
                new_k = match.group(1)
                d[new_k] = v
            else:
                pass  # Handle errors here

        return d