django-filter模块year查找表达式无法返回预期queryset问题求助
问题根因
你使用了错误的过滤器类型导致参数类型不匹配:
DateFilter会将输入值解析为datetime.date类型,且默认校验输入为完整日期格式(YYYY-MM-DD),所以你输入纯数字年份会触发Enter a valid date.的校验错误- 你配置的
lookup_expr='year__gt'是Django ORM的日期字段年份查询,要求传入的参数是整数类型的年份值,DateFilter解析得到的日期对象传入后就会触发类型不匹配的崩溃错误
修复方案
将过滤器类从DateFilter替换为NumberFilter即可,修改后的过滤器代码如下:
import django_filters from django_filters import NumberFilter from .models import * class InvoiceFilter(django_filters.FilterSet): billing_year = NumberFilter( label='Abrechnungsjahr', field_name='start_of_period', lookup_expr='year__gte', # 按需求用大于等于的查询条件 min_value=1990, # 可选:增加年份范围校验避免无效输入 max_value=2100 ) class Meta: model = RealEstateTax fields = ['realestate_id', 'billing_year']
修改后直接输入整数年份即可正常完成筛选,无需改动其他视图、模板代码。
可选优化方案(下拉选年份)
如果想要避免用户手动输入年份,可改用ChoiceFilter动态加载数据库中存在的所有年份供用户选择,代码示例:
import django_filters from django_filters import ChoiceFilter from .models import * def get_available_years(): # 从现有数据中提取所有存在的年份生成选项 year_objects = RealEstateTax.objects.dates('start_of_period', 'year', order='DESC') return [(item.year, item.year) for item in year_objects] class InvoiceFilter(django_filters.FilterSet): billing_year = ChoiceFilter( label='Abrechnungsjahr', field_name='start_of_period', lookup_expr='year__gte', choices=get_available_years ) class Meta: model = RealEstateTax fields = ['realestate_id', 'billing_year']
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

