refactor: filter_fields支持配置字典及列表格式

pull/102/head
Angelo 2023-07-14 15:50:07 +08:00
parent a77237ee40
commit 909c8a9324
2 changed files with 11 additions and 24 deletions

View File

@ -252,12 +252,12 @@ class UserViewSet(CustomModelViewSet):
filter_fields = ["^name", "~username", "^mobile", "is_active", "dept", "user_type", "$dept__name"]
# filter_fields = {
# "name": ["icontains"],
# "mobile": ["icontains"],
# "mobile": ["iregex"],
# "username": ["icontains"],
# "gender": ["icontains"],
# "is_active": ["icontains"],
# "dept": ["exact"],
# "user_type": ["exact"],
# "dept__name": ["icontains"],
# }
search_fields = ["username", "name", "gender", "dept__name", "role__name"]
# 导出

View File

@ -173,17 +173,6 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
return lookup
return None
# CASE: 前端query string过滤
# def find_filter_lookups(self, orm_lookups, search_term_key):
# for lookup, lookup_expr in orm_lookups.items():
# # if lookup.find(search_term_key) >= 0:
# search_key = self.construct_search(search_term_key, lookup_expr)
# new_lookup = LOOKUP_SEP.join(search_key.split(LOOKUP_SEP)[:-1]) if len(search_key.split(LOOKUP_SEP)) > 1 else lookup
# # 修复条件搜索错误 bug
# if new_lookup == lookup:
# return search_key
# return None
def get_filterset_class(self, view, queryset=None):
"""
Return the `FilterSet` class used to filter the queryset.
@ -347,21 +336,19 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
return queryset
if filterset.__class__.__name__ == "AutoFilterSet":
queryset = filterset.queryset
# orm_lookups = []
# for search_field in filterset.filters:
# if isinstance(filterset.filters[search_field], CharFilter):
# orm_lookups.append(
# self.construct_search(six.text_type(search_field), filterset.filters[search_field].lookup_expr)
# )
# else:
# orm_lookups.append(search_field)
orm_lookups = [self.construct_search(str(search_field)) for search_field in self.filter_fields]
# CASE: 前端query string过滤
# orm_lookups = {lookup: filterset.filters[lookup].lookup_expr for lookup in filterset.filters.keys()}
orm_lookup_dict = dict(
zip(
[field for field in self.filter_fields],
[filterset.filters[lookup].lookup_expr for lookup in filterset.filters.keys()],
)
)
orm_lookups = [self.construct_search(lookup, lookup_expr) for lookup, lookup_expr in orm_lookup_dict.items()]
# print(orm_lookups)
conditions = []
queries = []
for search_term_key in filterset.data.keys():
orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key)
# print(search_term_key, orm_lookup)
if not orm_lookup:
continue
query = Q(**{orm_lookup: filterset.data[search_term_key]})