From 4f30d02180430c0e625dcd7b9d98085123e402f4 Mon Sep 17 00:00:00 2001 From: lxy <46486798@qq.com> Date: Thu, 22 May 2025 04:01:05 +0000 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E9=97=B4=E8=BF=87=E6=BB=A4=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9B=B4=E5=A4=9A=E5=AD=97=E6=AE=B5=20update=20backen?= =?UTF-8?q?d/dvadmin/utils/filters.py.=20=E8=BF=87=E6=BB=A4=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=87=BA=E7=8E=B0=5Fafter=E5=92=8C=5Fbefore=E5=88=99?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=A4=84=E7=90=86=E6=97=B6=E9=97=B4=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=20eval(f"Q({key}=5F=5Fgte=3Dafter=5Fvalue)")?= =?UTF-8?q?=20key=E8=BF=99=E6=A0=B7=E4=BD=BF=E7=94=A8=E4=BC=9A=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E9=80=A0=E6=88=90sql=E8=BE=93=E5=85=A5=E9=A3=8E?= =?UTF-8?q?=E9=99=A9=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lxy <46486798@qq.com> --- backend/dvadmin/utils/filters.py | 66 ++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/backend/dvadmin/utils/filters.py b/backend/dvadmin/utils/filters.py index f61fc62e..97cddcd4 100644 --- a/backend/dvadmin/utils/filters.py +++ b/backend/dvadmin/utils/filters.py @@ -30,32 +30,50 @@ class CoreModelFilterBankend(BaseFilterBackend): 自定义时间范围过滤器 """ def filter_queryset(self, request, queryset, view): - create_datetime_after = request.query_params.get('create_datetime_after', None) - create_datetime_before = request.query_params.get('create_datetime_before', None) - update_datetime_after = request.query_params.get('update_datetime_after', None) - update_datetime_before = request.query_params.get('update_datetime_before', None) - if any([create_datetime_after, create_datetime_before, update_datetime_after, update_datetime_before]): - create_filter = Q() - if create_datetime_after and create_datetime_before: - create_filter &= Q(create_datetime__gte=create_datetime_after) & Q(create_datetime__lte=f'{create_datetime_before} 23:59:59') - elif create_datetime_after: - create_filter &= Q(create_datetime__gte=create_datetime_after) - elif create_datetime_before: - create_filter &= Q(create_datetime__lte=f'{create_datetime_before} 23:59:59') - - # 更新时间范围过滤条件 - update_filter = Q() - if update_datetime_after and update_datetime_before: - update_filter &= Q(update_datetime__gte=update_datetime_after) & Q(update_datetime__lte=update_datetime_before) - elif update_datetime_after: - update_filter &= Q(update_datetime__gte=update_datetime_after) - elif update_datetime_before: - update_filter &= Q(update_datetime__lte=update_datetime_before) - # 结合两个时间范围过滤条件 - queryset = queryset.filter(create_filter & update_filter) - return queryset + tmp_keys = list(request.query_params.keys()) + datetime_params = [] + for key, value in list(request.query_params.items()): + if key.endswith('_after'): + param_key = key.replace("_after", "") + before_key = f"{param_key}_before" + if before_key in tmp_keys: + # 有before参数, 处理日期格式,如果before 没有时间参数则自动补全为23:59:59 + before_time = auto_parse_datetime(request.query_params[before_key]) + if not isinstance(before_time, datetime): + before_time = datetime(before_time.year, before_time.month, before_time.day, 23, 59, 59, 999999) + + datetime_params.append((param_key, auto_parse_datetime(value), before_time)) + # 防止触发仅before过滤器 + tmp_keys.remove(before_key) + else: + # 没有before参数 + datetime_params.append((param_key, auto_parse_datetime(value), None)) + + elif key.endswith('_before') and key in tmp_keys: + # 没有after参数 + param_key = key.replace("_before", "") + + # 处理日期格式,如果before 没有时间参数则自动补全为23:59:59 + before_time = auto_parse_datetime(request.query_params[param_key]) + if not isinstance(before_time, datetime): + before_time = datetime(before_time.year, before_time.month, before_time.day, 23, 59, 59, 999999) + + datetime_params.append((param_key, None, before_time)) + + if datetime_params: + + datetime_filter = Q() + for key, after_value, before_value in datetime_params: + if after_value: + datetime_filter &= eval(f"Q({key}__gte=after_value)") + if before_value: + datetime_filter &= eval(f"Q({key}__lte=before_value)") + + queryset = queryset.filter(datetime_filter) + return queryset + def get_dept(dept_id: int, dept_all_list=None, dept_list=None): """ 递归获取部门的所有下级部门 -- Gitee