perf: 🐛 filter_fields使用exact无效,使用icontains等报错

fix: https://gitee.com/liqianglog/django-vue-admin/issues/I6QZW5
pull/98/head
李强 2023-05-28 13:24:51 +08:00
parent c9db799304
commit b8fa4e7b2a
2 changed files with 12 additions and 7 deletions

View File

@ -251,9 +251,9 @@ class UserViewSet(CustomModelViewSet):
update_serializer_class = UserUpdateSerializer update_serializer_class = UserUpdateSerializer
# filter_fields = ["name", "username", "gender", "is_active", "dept", "user_type"] # filter_fields = ["name", "username", "gender", "is_active", "dept", "user_type"]
filter_fields = { filter_fields = {
"name": ["exact"], "name": ["icontains"],
"mobile": ["exact"], "mobile": ["icontains"],
"username": ["exact"], "username": ["icontains"],
"gender": ["icontains"], "gender": ["icontains"],
"is_active": ["icontains"], "is_active": ["icontains"],
"dept": ["exact"], "dept": ["exact"],

View File

@ -154,12 +154,14 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
"~": "icontains", "~": "icontains",
} }
def construct_search(self, field_name): def construct_search(self, field_name, lookup_expr=None):
lookup = self.lookup_prefixes.get(field_name[0]) lookup = self.lookup_prefixes.get(field_name[0])
if lookup: if lookup:
field_name = field_name[1:] field_name = field_name[1:]
else: else:
lookup = "icontains" lookup = lookup_expr
if field_name.endswith(lookup):
return field_name
return LOOKUP_SEP.join([field_name, lookup]) return LOOKUP_SEP.join([field_name, lookup])
def find_filter_lookups(self, orm_lookups, search_term_key): def find_filter_lookups(self, orm_lookups, search_term_key):
@ -239,7 +241,10 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
# warn if the field doesn't exist. # warn if the field doesn't exist.
if field is None: if field is None:
undefined.append(field_name) undefined.append(field_name)
# 更新默认字符串搜索为模糊搜索
if isinstance(field, (models.CharField)) and filterset_fields == '__all__' and lookups == [
'exact']:
lookups = ['icontains']
for lookup_expr in lookups: for lookup_expr in lookups:
filter_name = cls.get_filter_name(field_name, lookup_expr) filter_name = cls.get_filter_name(field_name, lookup_expr)
@ -288,7 +293,7 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
for search_field in filterset.filters: for search_field in filterset.filters:
if isinstance(filterset.filters[search_field], CharFilter): if isinstance(filterset.filters[search_field], CharFilter):
orm_lookups.append( orm_lookups.append(
self.construct_search(six.text_type(search_field)) self.construct_search(six.text_type(search_field), filterset.filters[search_field].lookup_expr)
) )
else: else:
orm_lookups.append(search_field) orm_lookups.append(search_field)