【发布时间】:2019-03-25 01:40:57
【问题描述】:
我正在根据前端用户选择的多种搜索条件对我的数据集进行过滤。以下是一些注意事项:
- 所有过滤条件都是非强制性的。用户可以选择/输入值或将其留空。后端必须想办法检查 NULL。
- 下拉菜单是多选的,因此过滤表单数据可以有多个 ID 列表。 (大量 IN 查询)
- 还有与日期(从/到)相关的字段,可以留空。所以代码必须处理以下场景: 日期范围过滤 |日期 > DDMMYYYY |日期
这是我目前的做法:
class BookingExportFilterBackend(generic_filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
predicate = request.data
if all(dt in predicate for dt in ('from_date', 'to_date')):
queryset = queryset.filter(date__range=(predicate['from_date'], predicate['to_date']))
if 'from_date' in predicate and 'to_date' not in predicate:
queryset = queryset.filter(date__gte=predicate['from_date'])
if 'to_date' in predicate and 'from_date' not in predicate:
queryset = queryset.filter(date__lte=predicate['to_date'])
if 'state' in predicate:
queryset = queryset.filter(state__in=predicate['state'])
if 'clients' in predicate:
queryset = queryset.filter(client__in=predicate['clients'])
if 'camera_operators' in predicate:
queryset = queryset.filter(camera_operator__uuid__in=predicate['camera_operators'])
return queryset
我觉得可以改进,尤其是日期部分。我也在使用Q 库,但我对 Django 还是很陌生。 (PS:我来自 Java/Spring/Hibernate 背景)。
请帮助改进代码。
【问题讨论】:
标签: python django django-rest-framework q django-filter