如何在django-filter中实现支持逗号分隔参数的NOT IN查询
实现方案
Django ORM 本身没有内置 not_in 查询表达式,取反逻辑一般通过 exclude() 方法实现,对应到 django-filter 有两种常用实现方案:
方案1:自定义可复用的NotIn过滤器(推荐)
该方案和你现有 NumberInFilter 的用法一致,封装后可全局复用,最符合你预期的调用方式:
import django_filters class NumberNotInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): def filter(self, qs, value): # BaseInFilter 已自动将逗号分隔的字符串拆分为列表 if not value: return qs # 把默认的 filter 逻辑改为 exclude 即可实现 not in 效果 return qs.exclude(**{f"{self.field_name}__in": value}) # 使用方式 class BookFilter(django_filters.FilterSet): # 传入要排除的作者id,参数示例 ?author_exclude=1,2,3 author_exclude = NumberNotInFilter(field_name="author__id")
如果需要适配字符串等其他类型,只需要把继承的 django_filters.NumberFilter 换成对应类型的过滤器即可,比如 CharFilter。
方案2:通过method参数自定义过滤逻辑
适合仅单次使用、不需要复用过滤规则的场景,不需要额外封装过滤器类:
import django_filters class BookFilter(django_filters.FilterSet): author_not_in = django_filters.BaseInFilter( field_name="author__id", method="filter_exclude_author" ) def filter_exclude_author(self, qs, field_name, value): if not value: return qs return qs.exclude(**{f"{field_name}__in": value})
调用时传入参数 ?author_not_in=1,2,3 即可得到作者ID不在列表内的结果。
内容的提问来源于stack exchange,提问作者sadat
相关产品推荐
相关产品推荐

