【Django-ninja】django ninja中使用查询过滤器FilterSchema

Django ORM中过滤器

 

filter的基本用法

filter() 是 QuerySet 对象的一个方法,用于从数据库中过滤数据。它接受一个或多个关键字参数,每个参数都表示一个查询条件,它们之间是 AND 关系。

以下是 filter() 方法的基本用法示例:

  1. from myapp.models import MyModel# 查询所有 name 字段值为 'John' 的记录
    results = MyModel.objects.filter(name='John')# 查询所有 age 大于等于 25 的记录
    results = MyModel.objects.filter(age__gte=25)# 多个条件的 AND 关系
    results = MyModel.objects.filter(name='John', age__gte=25)# 使用 OR 条件,使用 Q 对象
    from django.db.models import Q
    results = MyModel.objects.filter(Q(name='John') | Q(age__gte=25))
    

    上述示例中,MyModel 是一个数据库模型,filter() 方法用于根据指定的查询条件过滤数据库中的记录。其中:

  2. (1) name='John' 表示查询 name 字段等于 'John' 的记录。

  3. (2) age__gte=25 表示查询 age 字段大于等于 25 的记录。

  4. (3) 多个条件之间是 AND 关系,即同时满足所有条件。

  5. (4) 使用 Q 对象可以实现 OR 关系,其中 Q(name='John') | Q(age__gte=25) 表示查询 name 字段等于 'John' 或 age 字段大于等于 25 的记录。

  6. Django中的常用过滤器
    基本查询过滤器:

    • exact: 等于,例如 field__exact=value
    • iexact: 不区分大小写的等于,例如 field__iexact=value
    • contains: 包含,例如 field__contains=value
    • icontains: 不区分大小写的包含,例如 field__icontains=value
  7. 范围查询过滤器:

    • gt: 大于,例如 field__gt=value
    • lt: 小于,例如 field__lt=value
    • gte: 大于等于,例如 field__gte=value
    • lte: 小于等于,例如 field__lte=value
  8. 空值查询过滤器:

    • isnull: 是否为空,例如 field__isnull=True
  9. IN 查询过滤器:

    • in: 在某个列表中,例如 field__in=[value1, value2]
  10. 日期查询过滤器:

    • date: 根据日期进行查询,例如 pub_date__date=some_date, pub_date__contains="2024-01"
  11. 时间查询过滤器:

    • time: 根据时间进行查询,例如 pub_time__time=some_time
  12. 外键查询过滤器:

    • ForeignKeyField__fieldname: 对于外键关系,可以使用 __ 来查询相关字段,例如 author__name__icontains=value
  13. 组合查询过滤器:

    • &(与)和 |(或):可以使用 &| 符号来组合多个查询条件,例如 Q(field1=value1) | Q(field2=value2)

2. django-ninja过滤器FilterSchema的用法

为什么已经有了Django ORM中的filter函数,还有整出个Django-ninja过滤器呢?

因为一般来说,从客户端用户发来一个请求,往往会带有很多查询参数。通过查询参数,在数据库中查找对应的记录。这些查询参数往往也并不是固定的。

如果我们直接通过手写代码构造filter需要的过滤条件,代码会相当丑陋,变得很难维护。

django-nina过滤器FilterSchema的作用就是对用户查询条件到数据库查询条件这一个过程的封装。

Django ORM的filter关心数据库的数据,而Django Ninja的过滤器关心用户与我们网站互动的方式。

2.1 基础用法

from ninja import FilterSchema, Field
from typing import Optionalclass BookFilterSchema(FilterSchema):name: Optional[str] = Noneauthor: Optional[str] = Nonecreated_after: Optional[datetime] = None

 

@api.get("/books")
def list_books(request, filters: BookFilterSchema = Query(...)):books = Book.objects.all()books = filters.filter(books)return books

2.2 一个稍微复杂一点的用法

自定义的过滤器继承FilterSchema。

1. filter_title_list方法用于处理title_list参数

class BookFilterSchema(FilterSchema):""" 过滤器用于从用户的请求参数,转化为查询的过滤条件。1. 默认使用类pub_date, title等字段进行过滤2. 如果不能满足条件,可以使用自定义的函数对某一个参数编写函数进行过滤,函数名称使用filter_开头3. 如果还不能满足要求,可以使用custom_expression定义一个完整的过滤查询器。这时候其他内置的查询条件都会被忽略掉。"""pub_date: date = Field(None)  # 默认值为None,不使用这个过滤器# title__in: List[str] = Field(None, alias="titles")title: str = Field(None)title_list: str = Field(None)  # 传输参数search: Optional[str] = Field(None, q=['title__icontains','pub_date__date'])def custom_expression(self) -> Q:""" 该函数如果定义了,将会被用作这个过滤器的自定义条件。其他所有的都会被忽略。"""q = Q()if self.title_list:titles = self.title_list.split(",")q = q & Q(title__in=titles)if self.title:q = q & Q(title=self.title)if self.pub_date:q = q & Q(pub_date=self.pub_date)if self.search:# sq = Q(title__icontains=self.search) | Q(pub_date__contains = Value(self.search, output_field=CharField()))sq = Q(title__icontains=self.search) | Q(pub_date__contains=self.search)q = q | sqreturn qdef filter_title_list(self, value: str) -> Q:"""自定义的过滤器函数,对传入的title_list字段转换成查询语句。title_list会使用‘,’进行切割,生产过滤条件。"""if value:titles = value.split(",")return Q(title__in=titles)else:return Q()@demo_api.get("/filter")
def events(request, filters: BookFilterSchema = Query(...)):  #books = Book.objects.all()print(filters.custom_expression())books = filters.filter(books)return ResponseSchema(data=books)

2.3 POST请求同时使用Path, Query,  Body的示例

post请求可以包含Path,Query, Body等多个输入。下面的示例给出了继承Schema规整化这些输入。如果需要将相应的输入应用成过滤器,需要继承FilterSchema,编写相应的过滤方法。

import datetime from ninja import NinjaAPI, Schema, UploadedFile, Form, File, Query, FilterSchema, Router, Path, Bodyclass DogSchema(Schema):# name: strdog_type: strage: intclass PathDate(Schema):year: intmonth: intday: intdef value(self):return datetime.date(self.year, self.month, self.day)@demo_api.post("/dog_mix_post/{year}/{month}/{day}")
def dog_mix_post(request, path: Path[PathDate], dog_item: DogSchema = Query(...), dog_item_body: DogSchema = Body(...)):""" name是路径参数;item是请求参数。"""return {"path": path.value(),"query": dog_item.dict(),"body": dog_item_body}

 

 

 

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

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

相关文章

基于springboot+vue的旅游管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究现状…

Flutter 各种Demo效果合集

Flutter 各种Demo实现效果: github:GitHub - PangHaHa12138/FlutterDemo: Flutter 各种Demo效果合集 1:2种 仿朋友圈 效果,顶部拉伸 和 不拉伸 2:仿抖音上下滑动视频播放 3:视频直播(使用的电视台的m3u…

Apache SeaTunnel (不含web) Window11 本机搭建(非源码)

启动环境 需要提前准备的(只提供作者试过且可行的方案) window11ubuntu20(wsl2) window11内置ubuntu的方式自行百度,此处不做陈述jdk8mysql8navicatvscode 环境准备不做过多陈述,以下是正式的安装启动步骤 SeaTunnel 2.3.3 资源准备 第一步: 创建文件…

Task05:PPO算法

本篇博客是本人参加Datawhale组队学习第五次任务的笔记 【教程地址】https://github.com/datawhalechina/joyrl-book 【强化学习库JoyRL】https://github.com/datawhalechina/joyrl/tree/main 【JoyRL开发周报】 https://datawhale.feishu.cn/docx/OM8fdsNl0o5omoxB5nXcyzsInGe…

2024年混合云:趋势和预测

混合云环境对于 DevOps 团队变得越来越重要,主要是因为它们能够弥合公共云资源的快速部署与私有云基础设施的安全和控制之间的差距。这种环境的混合为 DevOps 团队提供了灵活性和可扩展性,这对于大型企业中的持续集成和持续部署 (CI/CD) 至关重要。 在混…

基于springboot+vue的阿博图书馆管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

Pandas 数据结构 – Pandas CSV 文件

Pandas CSV 文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。 CSV 是一种通用的、…

06. 【Linux教程】终端工具

Linux 终端工具 前面介绍了如何安装虚拟机,还介绍了如何在虚拟机上安装 CentOs 操作系统,并且给 CentOs 配置了局域网固定 ip,那么此时的 CentOs 相当于是在局域网的一台服务器了,虚拟机上面已经自带终端工具,实际业务…

上传upload及显示img图片预览、删除

上传图片文件a-upload html部分 <div className="clearfix"><a-upload:custom-request="customRequest"listType="picture-card":fileList="fileList":onPreview="handlePreview":on-remove="del">&…

day39_mysql

今日内容 0 复习昨日 1 DML 2 约束 3 DQL 0 复习昨日 1 什么是数据库(Database)? 用来组织,存储,管理数据的仓库 2 什么是数据库管理系统(Database Management System-DBMS)? 用来管理数据库的一个软件 3 数据库分类 关系型数据库,Oracle,Mysql,SqlServer,DB2非关系数据库,Re…

【android】 android->profile 查看内存泄露

目录 实例讲解 各字段解释 实例讲解 各字段解释 在 Android Studio 的 Profile 视图中&#xff0c;Arrange by Stack 用于对内存分配和释放事件进行堆栈排列&#xff0c;以便更好地了解内存使用情况。以下是表上各列的一般含义&#xff1a; 1. **Call Chart (调用图)**: …

【Qt】—— Qt Creator 创建项目

目录 &#xff08;一&#xff09;Qt Creator概览 &#xff08;二&#xff09;使⽤Qt Creator新建项⽬ &#xff08;一&#xff09;Qt Creator概览 从开始菜单或者快捷⽅式打开Qt Creator集成开发环境&#xff0c;启动之后看到类似下⾯的界⾯&#xff1a; 【解释说明】 菜单栏…

ES6中新增Array.from()函数的用法详解

目录 Map对象的转换 Set对象的转换 字符串的转换 类数组对象的转换 Array.from可以接受三个参数 ES6为Array增加了from函数用来将其他对象转换成数组。当然&#xff0c;其他对象也是有要求&#xff0c;也不是所有的&#xff0c;可以将两种对象转换成数组。 1、部署了Iter…

代码安全审计经验集(下)

对HTTP加密请求参数的测试 对于HTTP请求体加密&#xff0c;如果直接使用明文的请求参数&#xff0c;是无法进行正常的安全测试的。但通常还是有办法分析出加解密的策略&#xff0c;如果能把加解密算法还原&#xff0c;就可以先将安全测试的payload添加到原始明文参数&#xff0…

SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常

目录 拦截器:是Spring框架提供的核心功能之一&#xff0c;主要用来拦截用户的请求&#xff0c;在指定方法前后&#xff0c;根据业务需要执行预先设定的代码: 自定义拦截器 统一数据格式&#xff0c;要包含状态码&#xff0c;错误信息​编辑 出现针对String类型的错误​​​…

【Linux C | 网络编程】netstat 命令图文详解 | 查看网络连接、查看路由表、查看统计数据

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【AI数字人-论文】Geneface论文

文章目录 前言pipelineaudio-to-motionMotion domain adaptation可视化 Motion-to-imageHead-NeRFTorso-NeRF 结果对比 前言 语音驱动的说话人视频合成旨在根据一段输入的语音&#xff0c;合成对应的目标人脸说话视频。高质量的说话人视频需要满足两个目标&#xff1a; &#…

ele-h5项目使用vue3+vite开发:第二节、search 搜索框组件开发

如何设计一个组件 需求分析 布局 content left-iconbodyinput-controlright-iconaction 功能 使用 defineEmits 定义组件的事件 在组件的script setup 里如何定义事件 使用defineEmits&#xff08;&#xff09;定义先声明事件接口 <script setup lang"ts"> int…

儿童护眼台灯怎么选择?一文教你如何选择儿童护眼台灯

护眼台灯是家长最常为孩子购买的用品之一&#xff0c;但是大部分人对它的了解并不多&#xff0c;很多人购买之后反而会觉得眼睛更容易疲劳&#xff0c;有不适的情况&#xff01;最主要的原因是因为挑选的台灯不够专业&#xff0c;次要原因则是使用方法不正确。所以今天跟大家讲…

Android.bp入门指南之浅析Android.bp文件

文章目录 Android.bp文件是什么&#xff1f;Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么&#xff1f; Android.bp 文件是 Android 构建系统&#xff08;Android Build System&#xff…