如何为drf_filters.FilterSet添加第二个字段的非空约束
实现方案
要确保查询结果中obsolete字段不为None,可以通过两种方式实现:
方式一:添加固定过滤条件(支持前端传控)
如果需要保留前端是否启用该过滤的灵活性,可以新增一个BooleanFilter,配合isnull查找表达式实现:
class MyFilterSet(drf_filters.FilterSet): uploaded = drf_filters.IsoDateTimeFilter( field_name='uploaded_at', lookup_expr='gt', required=True ) # 添加obsolete不为None的过滤规则 obsolete_not_null = drf_filters.BooleanFilter(field_name='obsolete', lookup_expr='isnull', exclude=True) class Meta: model = 你的模型类名 # 替换为实际使用的模型类 fields = ['uploaded', 'obsolete_not_null']
说明:
lookup_expr='isnull'用于判断字段是否为Noneexclude=True表示排除满足该条件的记录,最终保留obsolete不为None的数据- 前端可通过传递
obsolete_not_null=true来触发该过滤,若不需要前端控制,可将该字段设为required=True
方式二:重写get_queryset方法(全局强制过滤)
如果希望该约束始终生效,不允许前端绕过,可以重写FilterSet的get_queryset方法:
class MyFilterSet(drf_filters.FilterSet): uploaded = drf_filters.IsoDateTimeFilter( field_name='uploaded_at', lookup_expr='gt', required=True ) class Meta: model = 你的模型类名 fields = ['uploaded'] def get_queryset(self, queryset): # 先执行父类的过滤逻辑,再追加obsolete不为None的约束 queryset = super().get_queryset(queryset) return queryset.filter(obsolete__isnull=False)
说明:
- 这种方式下,无论前端是否传参,最终查询结果都会自动过滤掉
obsolete为None的数据 - 适合无需前端干预、必须强制生效的场景
内容的提问来源于stack exchange,提问作者Ajax
相关产品推荐
相关产品推荐

