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", "~username", "^mobile", "is_active", "dept", "user_type", "$dept__name"]
# filter_fields = { # filter_fields = {
# "name": ["icontains"], # "name": ["icontains"],
# "mobile": ["icontains"], # "mobile": ["iregex"],
# "username": ["icontains"], # "username": ["icontains"],
# "gender": ["icontains"],
# "is_active": ["icontains"], # "is_active": ["icontains"],
# "dept": ["exact"], # "dept": ["exact"],
# "user_type": ["exact"], # "user_type": ["exact"],
# "dept__name": ["icontains"],
# } # }
search_fields = ["username", "name", "gender", "dept__name", "role__name"] search_fields = ["username", "name", "gender", "dept__name", "role__name"]
# 导出 # 导出

View File

@ -173,17 +173,6 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
return lookup return lookup
return None 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): def get_filterset_class(self, view, queryset=None):
""" """
Return the `FilterSet` class used to filter the queryset. Return the `FilterSet` class used to filter the queryset.
@ -347,21 +336,19 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
return queryset return queryset
if filterset.__class__.__name__ == "AutoFilterSet": if filterset.__class__.__name__ == "AutoFilterSet":
queryset = filterset.queryset queryset = filterset.queryset
# orm_lookups = [] orm_lookup_dict = dict(
# for search_field in filterset.filters: zip(
# if isinstance(filterset.filters[search_field], CharFilter): [field for field in self.filter_fields],
# orm_lookups.append( [filterset.filters[lookup].lookup_expr for lookup in filterset.filters.keys()],
# self.construct_search(six.text_type(search_field), filterset.filters[search_field].lookup_expr) )
# ) )
# else: orm_lookups = [self.construct_search(lookup, lookup_expr) for lookup, lookup_expr in orm_lookup_dict.items()]
# orm_lookups.append(search_field) # print(orm_lookups)
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()}
conditions = [] conditions = []
queries = [] queries = []
for search_term_key in filterset.data.keys(): for search_term_key in filterset.data.keys():
orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key) orm_lookup = self.find_filter_lookups(orm_lookups, search_term_key)
# print(search_term_key, orm_lookup)
if not orm_lookup: if not orm_lookup:
continue continue
query = Q(**{orm_lookup: filterset.data[search_term_key]}) query = Q(**{orm_lookup: filterset.data[search_term_key]})