什么是搜索?
譬如http://127.0.0.1:8000/User/?username=maotai-0 可以检索出想要的.
自己实现原始的搜索
重写下get_queryset方法
class UserViewset(viewsets.ReadOnlyModelViewSet):
'''
List:
查询用户列表
Retrieve:
查询某用户详情
'''
queryset = user.objects.all()
serializer_class = UserSerialiser
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来实现搜索-支持drf
- 准备数据
- script/add_user.py
import sys
import os
project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
sys.path.append(project_dir)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ops.settings")
import django
django.setup()
from django.contrib.auth import get_user_model
User = get_user_model()
def get_users():
for user in User.objects.all():
print(user.username)
if __name__ == "__main__":
get_users()
- 配置搜索
pip install django_filters
安装到app
注: django_filters.rest_framework.DjangoFilterBackend 已支持drf.
使用系统内置的filterbackend
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import viewsets
from .serializer import UserSerialiser
class UserViewset(viewsets.ReadOnlyModelViewSet):
'''
List:
查询用户列表
Retrieve:
查询某用户详情
'''
queryset = user.objects.all()
serializer_class = UserSerialiser
filter_backends = (DjangoFilterBackend,) # 指定backends
filter_fields = ('username',) # 指定要搜索的字段(默认是全匹配的,不支持模糊,大小写)
指定filter_class 实现username模糊匹配
- users/filters.py
import django_filters
from django.contrib.auth import get_user_model
User = get_user_model()
class UserFilter(django_filters.FilterSet):
username = django_filters.CharFilter(field_name="username", lookup_expr='contains')
class Meta:
model = User
fields = ['username']
- users/vuews.py
class UserViewset(viewsets.ReadOnlyModelViewSet):
"""
retrieve:
返回指定用户信息
list:
返回用户列表
"""
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = (DjangoFilterBackend,) # 也可以将这个end放在settings.py里. 全局model就不需要写这个字段了
filter_class = UserFilter
filter_fields = ("username",)
将backend放在settings.py里
- settings.py
REST_FRAMEWORK = {
"PAGE_SIZE": 10,
#"DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
"DEFAULT_PAGINATION_CLASS":"users.pagination.Pagination",
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
)
}
指定method搜索
servers/filters.py
import django_filters
from django.db.models import Q
from .models import Server
server_queryset = Server.objects.all()
class ServerFilter(django_filters.FilterSet):
hostname = django_filters.CharFilter(method="search_hostname")
def search_hostname(self, queryset, name, value):
return queryset.filter(Q(hostname__icontains=value) | Q(ip__icontains=value))
class Meta:
model = Server
fields = ['hostname']
class ServerViewset(viewsets.ReadOnlyModelViewSet):
"""
list:
列出所有服务器信息
retrieve:
读取一个服务器信息
"""
queryset = Server.objects.all()
serializer_class = ServerSerializer
filter_class = ServerFilter
filter_fields = ('hostname',)