django filter for NOT IN as lookup_expr



我们可以使用"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"。你能给我一个解决方案吗?

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

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

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

我不确定在django过滤器中是否有一个简单的内置查找。但是,您可以很容易地在过滤器集类上使用.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