用于 NOT IN 作为lookup_expr 的 django 过滤器

Posted

技术标签:

【中文标题】用于 NOT IN 作为lookup_expr 的 django 过滤器【英文标题】:django filter for NOT IN as lookup_expr 【发布时间】:2021-12-02 21:07:27 【问题描述】:

我们可以使用“in”表达式发送逗号分隔的字符串来制作 django 过滤器。比如

import django_filters

class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
    pass

class BookFilter(django_filters.FilterSet):
    author = NumberInFilter(field_name="author__id", lookup_expr="in")

但是,我正在寻找发送逗号分隔的查询数据并获得没有查询数据的响应的方法。像

class BookFilter(django_filters.FilterSet):
    author = NumberInFilter(field_name="author__id", lookup_expr="not_in")

绝对没有像“not_in”这样的东西。你能给我一个解决方案吗?

【问题讨论】:

【参考方案1】:

我不确定在 django-filters 中是否有一个简单的内置函数可以进行排他性查找。但是,您可以使用带有 .exclude() 的过滤器集类上的自定义方法轻松完成此操作:

class BookFilter(django_filters.FilterSet):
    author = django_filters.NumberFilter(method='filter_author')

    def filter_author(self, queryset, name, value):
        return queryset.exclude(author_id__in=value)

【讨论】:

【参考方案2】:

只是想补充一下我最终得到的,

class BookFilter(django_filters.FilterSet):
    author = django_filters.NumberFilter(method='filter_author')

    def filter_author(self, queryset, name, value):
        if value:
            return queryset.exclude(author__id__in=value.split(','))
        return queryset

【讨论】:

以上是关于用于 NOT IN 作为lookup_expr 的 django 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

stop() 是用于停止动画 :animated 用于判断动画是否在进行中

为啥这种语法专门用于初始化字符串文字而不能用于字符数组? [复制]

UIImage 仅用于所选的 applicationActivities,但 NSString 用于所有 applicationActivities

Jest typescript 测试运行两次,一次用于 ts 文件,一次用于 js 文件

为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]

正确设置 IdentityServer4 Cookie 用于登录,JWT 令牌用于 API 授权