Django-filters如何使用BooleanFilter进行范围或其他

问题描述 投票:0回答:1

美好的一天,一个关于“django-filters”、“rest框架”的问题

如何制作过滤器
-1 选项最多占 50%(在十进制模型中),
50%后-2选项,
-3选项等于50

我使用布尔过滤器和一个附加的“方法”函数来做到这一点 - 两个字段,如果为真,则输出相应的查询集。然而,它们通过一个字段联系在一起,因此使用一个查询集,这使得它们在同时调用时互斥,而不是我需要的互补。 我还在看“ChoiceField”,但我不知道它是否可能。

附注我尝试在函数中使用 union 方法进行统一,但出现错误 “复合语句的子查询中不允许使用 ORDER BY。”

我的过滤器类代码:

class ProductsFilter(filters.FilterSet):
    type_one = filters.BooleanFilter(field_name='percentage_field', method='filter_one')
    type_two = filters.BooleanFilter(field_name='percentage_field',  method='filter_two')
    type_half = filters.BooleanFilter(field_name='percentage_field', method='filter_half')

    def filter_one(self, queryset, name, value):
        if value is True:
            return queryset.filter(percentage_field__range=(50.1, 100))
        else:
            return queryset

    def filter_two(self, queryset, name, value):
        if value is True:
            return queryset.filter(percentage_field__range=(0, 49.9))
        else:
            return queryset
    def filter_half(self, queryset, name, value):
        if value is True:
            asd = queryset
            return Product.objects.filter(percentage_field=50)
        else:
            return queryset

    class Meta:
        model = Product
        fields = ['name','price']

同时按一个或多个过滤器进行过滤,组合查询集且不相互排除

django django-models django-rest-framework django-filter
1个回答
0
投票

正如您所提到的,您可以使用

ChoiceFilter(...)
过滤器,如下所示

class ProductFilter(FilterSet):
    percentage_field = django_filters.ChoiceFilter(
        choices=[
            ("type_one", "Type One"),
            ("type_two", "Type Two"),
            ("type_half", "Type Half"),
        ],
        method="filter_percentage_field",
    )

    def filter_percentage_field(self, queryset, name, value):
        if value == "type_one":
            return queryset.filter(percentage_field__gt=50)
        elif value == "type_two":
            return queryset.filter(percentage_field__lt=50)
        elif value == "type_half":
            return queryset.filter(percentage_field=50)
        return queryset

    class Meta:
        model = Product
        fields = ["percentage_field"]

我使用

lt
gt
查找表达式更新了过滤逻辑,因为这更有意义。请随意根据您的业务逻辑更新代码中的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.