Python Django过滤器:建议改进动态过滤逻辑

Python Django过滤器:建议改进动态过滤逻辑,python,django,django-rest-framework,q,django-filter,Python,Django,Django Rest Framework,Q,Django Filter,我正在根据前端用户选择的多种搜索标准对数据集进行过滤。以下是一些注意事项: 所有筛选标准都是非强制性的。用户可以选择/输入值或将其留空。后端必须找到一种检查空值的方法。 下拉列表是多选的,因此筛选表单数据可以有多个ID列表。大量的查询 还有日期开始/结束相关字段,可以留空。因此,代码必须处理以下场景:日期范围过滤| Date>DDMMYYYY | Date

我正在根据前端用户选择的多种搜索标准对数据集进行过滤。以下是一些注意事项:

所有筛选标准都是非强制性的。用户可以选择/输入值或将其留空。后端必须找到一种检查空值的方法。 下拉列表是多选的,因此筛选表单数据可以有多个ID列表。大量的查询 还有日期开始/结束相关字段,可以留空。因此,代码必须处理以下场景:日期范围过滤| Date>DDMMYYYY | Date 这是我目前的做法:

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背景

请帮助改进代码。

您应该尝试使用lib进行筛选。它使用起来非常简单,并提供了一系列过滤选项

对于您的情况,您可以从以下内容开始: 注意:请不要使用date作为字段/变量名,在下面的示例中,我已替换为booking_date

class BookingFilter(django_filters.FilterSet):
    from_date = django_filters.NumberFilter(field_name='booking_date', lookup_expr='gt')
    to_date = django_filters.NumberFilter(field_name='booking_date', lookup_expr='lt')

    status = django_filters.CharFilter(name="status", lookup_type="contains"

    class Meta:
        model = Booking # replace with your appropriate Model