You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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'用于判断字段是否为None
  • exclude=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:15:42