Django-Filter使用LookupChoiceFilter实现交易盈亏平下拉筛选问题
解决方案
问题原因
你之前使用的LookupChoiceFilter的设计用途是让用户选择字段的标准查找表达式(比如大于/等于/小于这类Django ORM原生支持的lookup规则),你传入的自定义标识w/l/s不属于合法的lookup表达式,因此筛选逻辑不会被触发。
正确实现代码
import django_filters from django import forms from .models import Trade # 替换为你自己项目中Trade模型的导入路径 class StatsPortfolioFilter(django_filters.FilterSet): result = django_filters.ChoiceFilter( field_name='profit_loss_value_fees', label='交易结果', choices=[ ('w', '盈利'), ('l', '亏损'), ('s', '打平'), ], method='filter_by_result' # 绑定自定义筛选方法 ) class Meta: model = Trade fields = ['result'] # 可补充你需要的其他筛选字段 def filter_by_result(self, queryset, name, value): # name为当前绑定的数据库字段名,value为用户下拉选中的选项值 if value == 'w': return queryset.filter(**{f"{name}__gt": 0}) elif value == 'l': return queryset.filter(**{f"{name}__lt": 0}) elif value == 's': return queryset.filter(**{f"{name}__exact": 0}) # 无有效选中值时返回原查询集 return queryset
实现说明
- 改用
ChoiceFilter实现固定选项的下拉筛选,通过method参数自定义筛选逻辑 - 自定义筛选方法的三个参数为固定格式:
queryset是当前待筛选的查询集合,name是你绑定的数据库字段名,value是用户下拉选中的选项值 - 按照业务规则匹配value后返回对应过滤后的查询集即可正常生效
内容的提问来源于stack exchange,提问作者Alex Winkler
相关产品推荐
相关产品推荐

