18. 搜素,django_filters

原生

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',
    )
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值