Django使用DjangoFilterBackend时filter_fields如何包含全部模型字段
方案1:直接从模型字段生成filter_fields列表
如果你的视图固定对应Product模型,直接把filter_fields赋值为全字段名列表即可:
filter_fields = [field.name for field in Product._meta.fields]
如果需要排除部分敏感字段,添加过滤条件即可:
filter_fields = [ field.name for field in Product._meta.fields if field.name not in ['敏感字段1', '敏感字段2'] ]
方案2:自定义通用Mixin兼容__all__写法
如果你需要多个视图都支持filter_fields = '__all__'的写法,可以封装通用混入类:
class AllFieldsFilterMixin: def get_filter_fields(self): # 识别__all__标识,自动生成对应模型的全字段列表 if self.filter_fields == '__all__': return [field.name for field in self.queryset.model._meta.fields] return super().get_filter_fields()
之后你的视图类继承这个Mixin,就可以直接写filter_fields = '__all__'正常生效。
方案3:自定义FilterSet使用原生全字段支持
django-filter的FilterSet本身支持fields='__all__'配置,你可以单独定义过滤类:
from django_filters.rest_framework import FilterSet from .models import Product class ProductFilter(FilterSet): class Meta: model = Product fields = '__all__'
然后在视图中指定过滤类即可:
filterset_class = ProductFilter
注意:全字段过滤会默认暴露模型所有字段给前端查询,如有敏感字段务必手动排除,避免数据泄露风险。
内容的提问来源于stack exchange,提问作者gammawind
相关产品推荐
相关产品推荐

