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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:27:04