美好的一天,一个关于“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']
同时按一个或多个过滤器进行过滤,组合查询集且不相互排除
正如您所提到的,您可以使用
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
查找表达式更新了过滤逻辑,因为这更有意义。请随意根据您的业务逻辑更新代码中的逻辑。