Django3 模糊查询/filters.SearchFilter的使用,基于viewsets.ModelViewSet

news2024/11/26 10:29:46

背景描述

模型

from django.db import models

from interfaces.validate import validate_include
from testcases.models import Testcases
from utils.base_models import BaseModel
from utils.pure_validator import JSONValidator


class Interfaces(BaseModel):
    id = models.AutoField(verbose_name='id主键', primary_key=True, help_text='id主键')
    name = models.CharField('接口名称', max_length=200, unique=True, blank=False, null=False, help_text='接口名称')
    project = models.CharField('接口Path', max_length=200, unique=True, help_text='接口Path')

    project = models.ForeignKey('projects.Projects', on_delete=models.PROTECT,
                                related_name='interfaces', help_text='所属项目')
    env = models.ForeignKey('envs.Envs', on_delete=models.PROTECT, null=True, blank=True,
                            related_name='env', help_text='对应的环境变量', default=None)
    project_module = models.ForeignKey('project_module.ProjectModule', on_delete=models.PROTECT,
                                       related_name='interfaces', help_text='接口所属模块',
                                       null=True, blank=True, default=None)

    tester = models.CharField('测试人员', max_length=50, help_text='测试人员')
    desc = models.TextField('描述', max_length=200, null=True, blank=True, help_text='备注信息')
    # 请求类型,请求参数(Params Body Header Cookie Auth 设置),请求示例,响应示例,状态码,备注,状态,自定义字段
    REQUEST_TYPE_CHOICES = (
        ('GET', 'GET'),
        ('POST', 'POST'),
        ('PUT', 'PUT'),
        ('DELETE', 'DELETE'),
        ('PATCH', 'PATCH')
    )
    method = models.CharField('请求类型', max_length=10, choices=REQUEST_TYPE_CHOICES, default='get',
                              help_text='请求类型')
    # 请求参数
    params = models.JSONField('请求参数', null=True, blank=True, help_text='请求参数', validators=[JSONValidator()])
    json = models.JSONField('请求体', null=True, blank=True, help_text='请求Body', validators=[JSONValidator()])
    data = models.JSONField('请求表单', null=True, blank=True, help_text='请求表单', validators=[JSONValidator()])

    headers = models.JSONField('请求Header', null=True, blank=True, help_text='请求Header',
                               validators=[JSONValidator()])
    cookies = models.JSONField('请求Cookie', null=True, blank=True, help_text='请求Cookie',
                               validators=[JSONValidator()])
    auth = models.CharField('请求Auth', max_length=100, null=True, blank=True, help_text='请求Auth')
    response_example = models.TextField('响应示例', null=True, blank=True, help_text='响应示例')
    response_status_code = models.CharField('状态码', max_length=10, null=True, blank=True, help_text='状态码')
    STATUS_CHOICES = (
        ('published', '已发布'),
        ('testing', '测试中'),
        ('deprecated', '已废弃'),
        ('developing', '开发中')
    )
    status = models.CharField('状态', max_length=20, choices=STATUS_CHOICES, default='published')
    include = models.JSONField('接口前置信息', help_text='接口前置信息', validators=[validate_include])

    class Meta:
        db_table = 'tb_interfaces'
        verbose_name = '接口信息'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

视图

import logging
from datetime import datetime

from rest_framework import filters
from rest_framework import permissions
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

from interfaces.models import Interfaces
from project_module.models import ProjectModule
from testcases.models import Testcases
from utils.json_utils import json_utils
from .serializers import InterfacesModelSerializer, TestcasesInterfacesModelSerializer, \
    ConfiguresInterfacesModelSerializer, InterfacesRunSerializer

logger = logging.getLogger('Django')


class InterfacesViewSet(viewsets.ModelViewSet):
    """
    list:
    获取接口列表数据

    retrieve:
    获取接口详情数据

    update:
    更新接口信息

    names:
    获取接口名称

    sava_case:
    保存接口为用例

    """
    queryset = Interfaces.objects.all()
    serializer_class = InterfacesModelSerializer

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['=name', '=id', '=tester']
    # search_fields = ['name', 'id', 'tester']
    ordering_fields = ['id', 'name', 'tester']

    permission_classes = [permissions.IsAuthenticated]

Search实现的全量查询

首先我们在视图中,规定了查询字段。

queryset = Interfaces.objects.all()
serializer_class = InterfacesModelSerializer

# 指定筛选和排序后端
filter_backends = [filters.SearchFilter, filters.OrderingFilter]

# 定义搜索字段,'=' 表示精确匹配
search_fields = ['=name', '=id', '=tester']

如果你想改成模糊查询,你可以将 search_fields 的设置改为:

search_fields = ['name', 'id', 'tester']

代码语法

search_fields​ 属性在 Django REST framework 中用于指定哪些字段应该被 SearchFilter​ 后端用于搜索查询。以下是各种前缀和后缀的详细解释:

  1. ‘^’:此前缀表示字段应以搜索项开头。例如,如果你有一个名为 ‘name’ 的字段,并且设置为 '^name'​,那么搜索字符串 ‘abc’ 将匹配任何名称以 ‘abc’ 开头的项目。
  2. ‘=’:此前缀表示字段应完全匹配搜索项。例如,如你有一个名为 ‘name’ 的字段,并且设置为 '=name'​,那么搜索字符串 ‘abc’ 将只匹配名称完全等于 ‘abc’ 的项目。
  3. ‘@’:此前缀仅适用于文本字段。它表示字段应与搜索项进行全文搜索(仅适用于支持全文搜索的数据库)。
  4. $​:此前缀表示字段应完全匹配搜索项。例如,如你有一个名为 ‘name’ 的字段,并且设置为 'name$'​,那么搜索字符串 ‘abc’ 将只匹配名称以 ‘abc’ 结尾的项目。

如果不使用任何符号,将默认进行包含(即模糊)匹配。例如,如果你设置为 'name'​,那么搜索字符串 ‘abc’ 将匹配任何名称中包含 ‘abc’ 的项。

注意:这些都是基于 ORM 查询用语实现的,由于 ORM 查询用语依赖于数据库引擎,所以在某些数据库中可能无法工作。

/swagger/json/

image

精确匹配

image

由于之前配置了name​为查询字段,则输入对应的值,可以如图精准查询到值。

反向示例

若输入部分则无法查询到

image

由于之前没有配置desc​,所以没法查询到对应的值

image

此处为反向示例,下面的内容由于篇幅原因不在一一赘述。

部分匹配

    # 精准匹配
    # search_fields = ['=name', '=id', '=tester']
    # 部分匹配
    search_fields = ['name', '=id', '^desc']
  1. 'name'​:这个设置表示在 name​ 字段上执行包含搜索。也就是说,如果你所提供的搜索字词出现在 name​ 字段中的任何位置,该项都会被返回。例如,如果搜索 ‘abc’,将会返回所有 name​ 字段中包含 ‘abc’ 的项目。

    name

    image

  2. '=id'​:这里的等号前缀表示只有当 id​ 字段的值和搜寻字词完全匹配时才返回结果。例如,如果搜索词为 ‘123’,那么仅当 id​ 字段完全等于 ‘123’ 的项目才会被返回。

    id

    image

  3. 'desc'​:这个设置意味着搜索将匹配以搜索字词开头的 desc​ 字段。例如,如果搜索 ‘intro’,那么所有 desc​ 字段以 ‘intro’ 开头的项目都会被返回。

    desc

    image

匹配以xxx结尾,作者模拟出现一些问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux驱动开发——常见框架梳理

前言 本文主要介绍了Linux驱动开发中一些常用的驱动框架,platform、input、iic、spi等,硬件平台使用的是正点原子的imx6ull开发板。 一:Pinctrl子系统、Gpio子系统 不管什么框架最后都是要追溯到配置IO的电气属性和复用功能 如果要使用外部…

一起学数据结构(1)——复杂度

目录 1. 时间复杂度: 1.1 时间复杂度的概念: 1.2 时间复杂度的表示及计算: 1.3 较为复杂的时间复杂度的计算: 2. 空间复杂度: 2.1 空间复杂度的概念: 2.2 空间复杂度的计算: 1. 时间复杂度…

Kubernetes 简介:容器编排与集群管理的进化

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Mybatis-plus从入门到精通

1、什么是MyBatis-Plus MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,在MyBatis的基础上对其进行扩展,用于简化MyBatis操作,提高开发效率。它继承了MyBatis原生的所有特性,并且添加了一些额外的功能&…

《TCP IP网络编程》第十章

第 10 章 多进程服务器端 10.1 进程概念及应用 并发服务端的实现方法: 通过改进服务端,使其同时向所有发起请求的客户端提供服务,以提高平均满意度。而且,网络程序中数据通信时间比 CPU 运算时间占比更大,因此&#…

探析国内数字孪生引擎技术现状

在数字孪生软件来发中,渲染引擎是一个关键点,国内大多数字孪生平台引擎通常使用的是自研的渲染引擎或者采用开源的渲染引擎。下面通过一些常见的渲染引擎在国内数字孪生引擎中的应用带大家了解数字孪生软件开发的方式。 自研渲染引擎:许多数…

CNN + Vision Transformer 结合学习

介绍三篇结合使用CNNTransformer进行学习的论文:CvT(ICCV2021),Mobile-Former(CVPR2022),SegNetr(arXiv2307). CvT: Introducing Convolutions to Vision Transformers, …

利用 trait 实现多态

我在书上看到基于 std::io::Write 的示例,它是一个 trait 类型,内部声明了一些方法。和 go 语言不同,rust 中类型必须明确实现 trait 类型,而 go 语言属于 duck 模式。 std::io::Write下面的例子中调用 write_all 方式来演示&…

标签是系列色并且加粗帆软

标签是系列色并且加粗 function(){return <span style"color:this.color;">FR.contentFormat(this.value, #,##0)</span>;}

UI 自动化的 PageObject 设计模式

目录 前言&#xff1a; 什么是 PageObject 模型&#xff1f; 为什么使用 PageObject 模型&#xff1f; PO 模式优点 PageObject 实践 前言&#xff1a; UI 自动化是一种软件测试方法&#xff0c;它主要用于检查应用程序的用户界面是否符合预期。PageObject 是 UI 自动化中…

AI大模型时代下运维开发探索第一篇:ReAct工程初探

引子 人工智能大模型的出现&#xff0c;已渐渐地影响了我们的日常生活和工作方式。生活中无处不在的AI&#xff0c;使我们的生活变得更加智能和便捷。工作中&#xff0c;AI大模型的高效和精准&#xff0c;极大地提升了我们解决问题的效率。 是的&#xff0c;我们不能忽视AI大…

Delphi 开发者,显示图片请忘掉VCL中的 TImage 吧

目录 序言 使用TImageCollection和TVirtualImageList组件支持高分辨率图像 一、总览 二、使用图像收集组件TImageCollection 2.1 图像收集组件编辑器 2.2 将现有 TImageList 载入 TImageCollection 三、使用Virtual ImageList 组件 3.1 Virtual ImageList Component 编辑…

【数据结构】| 王道考研——树的前世今生

目录 一. &#x1f981; 前言二. &#x1f981; 各种树的知识点1. 树1.1 概念1.2 属性1.3 常考性质1.4 树转换成二叉树1.5 森林转换为二叉树1.6 二叉树转换为森林1.7 树的遍历1.8 森林的遍历 2. 二叉树2.1满二叉树2.2 完全二叉树2.3二叉排序树2.4 平衡二叉树2.5 二叉树常考性质…

IDEA使用lombok实体类加上@Data注解后无法找到get和set方法

文章目录 一、问题原因二、解决方法1.File→Settings2.Plugins→搜索"lombok"→Install3.Restart IDE&#xff08;重启IDEA&#xff09; 一、问题原因 IDEA没有安装lombok插件 二、解决方法 1.File→Settings 2.Plugins→搜索"lombok"→Install 3.Restart…

北斗定位导航系统,北斗模块应用领域发展概况_北斗二号模块,北斗三号模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、北斗系统概述1.1 空间段1.2 地面控制段1.3 用户段1.4 坐标系统1.5 时间系统 二、北斗系统定位导航授时服务2.1 服务概述2.2 服务区2.3 北斗信号频段2.4 北斗…

服务器中了Locked勒索病毒怎么解决,勒索病毒解密恢复方式与防护措施

服务器是企业重要数据存储和处理的关键设备&#xff0c;然而&#xff0c;众所周知&#xff0c;服务器系统并非完全免受网络攻击的。其中一种常见的威胁是勒索病毒&#xff0c;其中一种恶名昭彰的变种是Locked勒索病毒。Locked勒索病毒采用了对称AES与非对称RSA的加密形式&#…

【C++入门到精通】C++入门 —— 引用、内联函数

目录 一、引用 1.引用的概念 2.引用的特性 3.常引用 4.引用的使用场景 ⭕做参数 ⭕做返回值 5.传值、传引用效率比较 值和引用的作为返回值类型的性能比较 6.引用和指针的区别 引用和指针的不同点 二、内联函数 1.内联函数的概念 2.内联函数的特性 3.宏与内联函数 …

RocketMQ教程-(5)-功能特性-顺序消息

顺序消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍顺序消息的应用场景、功能原理、使用限制、使用方法和使用建议。 应用场景​ 在有序事件处理、撮合交易、数据实时增量同步等场景下&#xff0c;异构系统间需要维持强一致的状态同步&#xff0c;上游的事…

13.4.2 【Linux】sudo

相对于 su 需要了解新切换的使用者密码 &#xff08;常常是需要 root 的密码&#xff09;&#xff0c; sudo 的执行则仅需要自己的密码即可。sudo 可以让你以其他用户的身份执行指令 &#xff08;通常是使用 root 的身份来执行指令&#xff09;&#xff0c;因此并非所有人都能够…

Spring 多数据源方法级别注解实现

Spring框架提供了多种数据源管理方式&#xff0c;其中多数据源管理是其中之一。多数据源管理允许应用程序使用多个数据源&#xff0c;而不是只使用一个数据源&#xff0c;从而提高了应用程序的灵活性和可靠性。 多数据源管理的主要目的是让应用程序能够在不同的数据库之间切换&…