【问题标题】:Adding filter in django OrderingFilter在 django OrderingFilter 中添加过滤器
【发布时间】:2021-02-14 19:37:22
【问题描述】:

有没有办法为特定排序字段(如 OrderingFilter 中的“created”)向查询集添加过滤器? 我想要这个过滤器进行排序:

F('created').desc(nulls_last=True)

这是我的代码:

class ProductFilter(filters.FilterSet):
    ordering = filters.OrderingFilter(fields=['price', 'created'])

    class Meta:
        model = Product

【问题讨论】:

  • class Meta 中,您必须拥有fields 属性并传递您要过滤的所有字段。在那里你也可以定义额外的字段

标签: django django-rest-framework django-filter django-filters


【解决方案1】:

这对我有用:

class NullsLastOrderingFilter(filters.OrderingFilter):
    def filter(self, qs, value):
        if value in ([], (), {}, '', None):
            return qs

        ordering = [self.get_ordering_value(param) for param in value]

        def filter_object(x):
            return F(x[1:]).desc(
                nulls_last=True
            ) if x[0] == '-' else F(x).asc(
                nulls_last=True
            )

        if ordering:
            ordering = map(filter_object, ordering)
            queryset = qs.order_by(*ordering)

        return queryset


class ProductFilter(filters.FilterSet):
    ordering = NullsLastOrderingFilter(fields=['price', 'created'])

    class Meta:
        model = Product

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2017-03-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多