尝试使用Django过滤器为给定模型中的所有字段创建常规搜索

时间:2019-06-28 13:49:00

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

因此,我正在为我的模型创建一个自定义过滤器,我希望该过滤器中的所有字段均不使用“精确”,而使用“包含”,但是我不想手动添加所有字段。我正在尝试做这样的事情:

BatchDTO

所以第二行有效,但是我的for循环不起作用,并且我的过滤器使用“精确”而不是“包含”

3 个答案:

答案 0 :(得分:1)

您可以创建一个自定义的FilterSet类,该类将覆盖get_fields方法,以将查找从exact更改为icontains

class CustomFilterSet(FilterSet):
    @classmethod
    def get_fields(cls):
        fields = super().get_fields()
        for name, lookups in fields.items():
            lookups[:] = ['icontains']
        return fields

现在,您只需使ChoiceFilter从此类继承:

class ChoiceFilter(CustomFilterSet):
    class Meta:
        model = Choice
        fields = '__all__'

请记住,对字段使用__all__被认为是危险的。

答案 1 :(得分:0)

从django-filter v2.3开始,您可以仅在FILTERS_DEFAULT_LOOKUP_EXPR = 'icontains'中定义settings.py,这将更改默认行为。

答案 2 :(得分:0)

在我的用例中,我需要通过多个基于日期的查找表达式来过滤单个 DateTimeField。最有效的方法是在我的字段字典中使用 date__ 前缀:

# Bullet Filter
class BulletFilter(filters.FilterSet):
    class Meta:
        model = Bullet
        fields = {
            'bullet_header': ['icontains'],
            'bullet_cite_date': ['iexact', 'gte', 'lte'],
            'created': ['date__iexact', 'date__gte', 'date__lte'],
            'updated': ['date__iexact', 'date__gte', 'date__lte'],
        }

这里bullet_header是一个CharField,bullet_cite_date是一个DateField,createdupdated是DateTimeFields。< /p>