Django_filters多过滤字段应用AND逻辑组合不生效如何解决
问题根源
你自定义的year_filter过滤方法没有基于传入的、已经应用了其他过滤条件的查询集(queryset参数)进行筛选,而是直接调用Plant.objects.filter()创建了全新的查询集,完全覆盖了此前name字段已经完成的过滤结果,因此两个条件同时使用时仅年份过滤生效。
修复方案
直接修改year_filter方法,复用传入的queryset参数进行筛选即可:
# filters.py 修正后代码 def year_filter(self, queryset, name, value): return queryset.filter( used_in_plant__year=value )
注:当前场景仅单个过滤条件,无需使用Q对象,直接写过滤参数即可。
可选简化方案
你也可以完全省略自定义过滤方法,直接通过field_name指定关联字段路径,由django-filter自动处理关联查询,从根源避免此类问题:
class PlantsNameFilter(django_filters.FilterSet): name = ModelChoiceFilter(queryset=Plant.objects.all()) # 直接指定关联字段路径,无需自定义过滤方法 year = django_filters.NumberFilter(field_name='used_in_plant__year', label='Year') class Meta: model = Plant fields =["name", "year"]
修正后两个过滤条件会自动以AND逻辑叠加,符合你要求的所有过滤字段同时生效的需求。
内容的提问来源于stack exchange,提问作者piah
相关产品推荐
相关产品推荐

