[django]drf知识点梳理-搜索

什么是搜索?
譬如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',)

原文地址:https://www.cnblogs.com/iiiiiher/p/9923526.html