原生
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回一个实例,当前也就是返回一个用户信息
list:
返回用户列表
"""
queryset = User.objects.all()
serializer_class = UserSerializer
# 搜索模型,最原始的
def get_queryset(self):
queryset = super(UserViewSet, self).get_queryset()
# 获取数据
username = self.request.query_params.get("username",None)
if username:
queryset = queryset.filter(username__icontains=username)
return queryset
django-filter
安装
[root@sdns users]# pip install django-filter
配置
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',
'idcs.apps.IdcsConfig',
'users.apps.UsersConfig',
'cabinet.apps.CabinetConfig',
'manufacturer.apps.ManufacturerConfig',
'servers.apps.ServersConfig',
]
使用
from django_filters.rest_framework import DjangoFilterBackend
User = get_user_model()
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回一个实例,当前也就是返回一个用户信息
list:
返回用户列表
"""
queryset = User.objects.all()
serializer_class = UserSerializer
# 使用django_filters 进行搜索,这是完全匹配
filter_backends = (DjangoFilterBackend,)
# 按哪个字段进行搜素
filter_fields=("username",)
效果
高级搜索
搜索模型
import django_filters
from django.contrib.auth import get_user_model
from django.db.models import Q
User = get_user_model()
'''
class UserFilter(django_filters.FilterSet):
# 搜索方法
username = django_filters.CharFilter(field_name="username",lookup_expr='contains')
#lookup_expr 搜索方式,contains 模糊匹配并且区分大小写,icontains 不区分大小写,exact 准确匹配
class Meta:
model=User
fields=["username"]
'''
# 通过方法,指定多个字段
class UserFilter(django_filters.FilterSet):
# username必须包含在 Meta当中的fields中
username = django_filters.CharFilter(method="search_name")
#lookup_expr 搜索方式,contains 模糊匹配并且区分大小写,icontains 不区分大小写,exact 准确匹配
def search_name(self,queryset,name,value):
return queryset.filter(Q(username__icontains=value)|Q(email__icontains=value))
class Meta:
model=User
fields=["username"]
使用高级搜索
from .filters import UserFilter
class UserViewSet(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回一个实例,当前也就是返回一个用户信息
list:
返回用户列表
"""
queryset = User.objects.all()
serializer_class = UserSerializer
# 使用django_filters 进行搜索
filter_backends = (DjangoFilterBackend,)
# 使用搜索模型,还需要指定搜索模型,不需在这指定字段
filter_class=UserFilter
全局生效
filter_backends=(DjangoFilterBackend,) 这段代码可以放在settging,让其全局生效
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS':(
'django_filters.rest_framework.DjangoFilterBackend',
)
}