【问题标题】:Django Filters: Suggest improvements to dynamic filtering logicDjango Filters:建议改进动态过滤逻辑
【发布时间】: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


    【解决方案1】:

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

    对于您的情况,您可以从以下内容开始: 注意:请不要使用日期作为字段/变量名,我在下面的示例中已替换为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 2018-06-19
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多