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=chetorzRun 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)
| 归档时间: |
|
| 查看次数: |
5327 次 |
| 最近记录: |