django-filters:icontains 类型的查找表达式无法正常工作

Mos*_*imi 5 python django django-filter django-rest-framework

我正在django-filter根据用户输入过滤结果查询。

想象一下我有以下帖子:

[
    {
        "id": 1,
        "title": "salam",
        "content": "chetori",
        "is_draft": false,
        "author": 1
    }
]
Run Code Online (Sandbox Code Playgroud)

我创建了一个filterset_class,如下所示:

class PostFilter(filter.FilterSet):
    class Meta:
        model = Post
        fields = {
            'title': ['icontains'],
            'content': ['icontains'],
        }
Run Code Online (Sandbox Code Playgroud)

每当我使用 icontains 时都无法正常工作,例如http://localhost:8000/posts/?content=chetorz查询应该返回空列表,但事实并非如此:

查询结果

但每当我将以下行添加到项目中时它就会起作用settings.py

FILTERS_DEFAULT_LOOKUP_EXPR = 'icontains'
Run Code Online (Sandbox Code Playgroud)

我不知道如何在不更改 LOOKUP_EXPR 的默认行为的情况下更改代码以使其正常工作。

PS视图.py:

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    filter_backends = [rest_filters.SearchFilter, filters.DjangoFilterBackend]
    filterset_class = PostFilter
    search_fields = ['title', 'content', 'author__user__username']

    def get_permissions(self):
        if self.action == "create":
            self.permission_classes = [permissions.IsAuthenticated]

        elif self.action == "list":
            pass

        return super(PostViewSet, self).get_permissions()

Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 10

对于您的过滤器集,您需要附加查找,因此:

http://localhost:8000/posts/?content__icontains=chetorz
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过手动指定字段来默认使用icontains查找,例如:

class PostFilter(filter.FilterSet):
    title = django_filters.CharFilter(lookup_expr='icontains')
    content = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Post
        fields = ['title', 'content']
Run Code Online (Sandbox Code Playgroud)