NOT IN 的 django 过滤器为 lookup_expr

django filter for NOT IN as lookup_expr

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

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”这样的东西。你能给我一个解决方案吗?

我不确定在 django-filters 中是否有一个简单的内置函数来进行独占查找。但是,您可以使用过滤器集 class 上带有 .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)

只是想补充一下我终于得到的东西,

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

似乎有更优的解决方案。您可以像这样使用 NumberFilters 的 exclude=True 选项:

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