因此,我正在为我的模型创建一个自定义过滤器,我希望该过滤器中的所有字段均不使用“精确”,而使用“包含”,但是我不想手动添加所有字段。我正在尝试做这样的事情:
BatchDTO
所以第二行有效,但是我的for循环不起作用,并且我的过滤器使用“精确”而不是“包含”
答案 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,created和updated是DateTimeFields。< /p>