django-filter是一个非常高效的过滤器。但是有时候他怎么设置也不生效。IDE没有错误提示,代码看起来完全没有问题,但是就是没有筛选结果。Why?
这个问题其实我是解决了的,我一直以为只有我不明白原因。结果今天一个同事也在挠头,为啥不生效呢?我才意识到,这个问题可能很多人都不知道是怎么回事。
不生效的原因是你肯定使用了rest_framework框架。倒不是说这个框架有什么问题。而是这个过滤器为rest_framework专门做了点小改动。请仔细观察以下代码与你不生效代码之间的区别。
写法一:
class BookView(ModelViewSet):
queryset = Book.objects
serializer_class = BookSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ('title',)
写法二:
class BookFilter(filters.FilterSet):
# 定义请求关键字
t = filters.CharFilter(field_name='title',lookup_expr='icontains')
class Meta:
model = Book
fields = ['t']
class BookView(ModelViewSet):
queryset = Book.objects
serializer_class = BookSerializer
filterset_class = BookFilter
至于原因嘛,请认真阅读官方文档:
https://django-filter.readthedocs.io/en/stable/guide/rest_framework.html
最后再感慨一下,官方文档还是要认真看。