有关django-filter不生效的原因

有关django-filter不生效的原因

django-filter是一个非常高效的过滤器。但是有时候他怎么设置也不生效。IDE没有错误提示,代码看起来完全没有问题,但是就是没有筛选结果。Why?

这个问题其实我是解决了的,我一直以为只有我不明白原因。结果今天一个同事也在挠头,为啥不生效呢?我才意识到,这个问题可能很多人都不知道是怎么回事。

不生效的原因是你肯定使用了rest_framework框架。倒不是说这个框架有什么问题。而是这个过滤器为rest_framework专门做了点小改动。请仔细观察以下代码与你不生效代码之间的区别。

写法一:

class BookView(ModelViewSet):
     queryset = Book.objects
     serializer_class = BookSerializer
     filter_backends = [DjangoFilterBackend]
     filterset_fields = ('title',)

写法二:

from django_filters.filters import CharFilter
from django_filters import rest_framework
from django_filters import filters

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

最后再强调一下,官方文档还是要认真看。