Django框架之模型查询介绍及示例

news2024/10/6 8:32:43

本篇文章所使用模型查询都在《Django框架之模型自定义管理器》基础上讲解查询和使用示例,通过看前篇可以有助于理解内容。

概述

查询集:从数据库获取的对象集合

查询集可以有多个过滤器

过滤器就是一个函数,根据所给的参数限制查询集结果

从sql角度来说,查询集合与select语句等价,过滤器就像where条件

查询集

链式调用

在管理器上调用过滤器方法返回查询集

查询集经过滤器筛选后返回新的查询集,所以可以写成链式调用。

即:->filter()->filter()

惰性执行

创建查询集不会带来任何数据的访问,直到调用数据才会访问数据。

直接访问数据的情况:迭代、序列化、与if合用。

过滤器

返回查询集的方法称为过滤器

all() 不过滤,返回所有

filter() 保留符合条件的数据

filter(键=值)

filter(键=值,键=值)

filter(键=值)->filter(键=值)

exclude() 过滤掉符合条件的数据

order_by() 排序

values() 一条数据就是一个对象(字典),返回一个列表

返回单条数据

get()

返回一个(唯一)满足条件的对象

示例:

info = Students.stuObj2.get(id=1)

注意:

如果没有找到符合条件的对象,会引发“模型类.DoesNotExist”异常

如果找到多个对象,会引发“模型类.MultipleObjectsReturned”异常

count() 

返回当前查询集中的对象个数

需要借助于filter来过滤条件,或者不使用过滤器来获取数据全部条数

示例:

num = Students.stuObj2.count()
num = Students.stuObj2.filter(gender=0).count()

first()

返回查询集中的第一个对象

示例:

one = Students.stuObj2.first()
one1 = Students.stuObj2.filter(gender=1).first()

last() 

返回查询集中的最后一个对象

示例:

last = Students.stuObj2.last()
last1 = Students.stuObj2.filter(gender=1).last()

exists() 

判断查询集中是否有数据,返回布尔值。

示例:

bool = Students.stuObj2.exists()
bool1 = Students.stuObj2.filter(id=1).exists()
bool2 = Students.stuObj2.filter(id=9).exists()

update()

执行SQL update语句更新指定字段并返回匹配的数量(该数据仅与匹配的数据量有关)。

示例:

Students.stuObj2.filter(id=1).update(hobby='篮球', desc='三箭定天山')

delete()

执行SQL delete语句删除全部匹配的QuerySet数据。

返回被删除的对象总数以及每一类对象具体被删除的数量。

示例:

Students.stuObj2.filter(id=9).delete()

注意:当被删除的对象是其他模型数据的外键时,其他模型中相应的数据也会被删除。

限制查询集

查询集返回列表,可以使用下标方法进行限制,等同于mysql中limit。

注意:下标不能是负数

视图

def student_page(request, page):
    """学生列表分页"""

    # (0-2) (2-4) (3-6)
    #  1      2     3
    count = 2
    offset = (page - 1) * count
    studentList = Students.stuObj2.all()[offset:(page * count)]
    return render(request, 'myapp/students.html', {'studentsList': studentList})

路由

path('studentPage/<int:page>', views.student_page, name='studentPage')

模板

Templates/myapp/students.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级详情</title>
</head>
<body>
  <h1>班级详情</h1>
<table>
    <thead>
    <tr>
        <th>ID</th>
        <th>名称</th>
        <th>性别</th>
        <th>年龄</th>
        <th>描述</th>
        <th>是否删除</th>
    </tr>
    </thead>
    <tbody>
    {% for item in studentsList %}
        <tr>
            <td>{{item.id}}</td>
            <td><a href="#">{{item.name}}</a></td>
            <td>{{item.gender}}</td>
            <td>{{item.age}}</td>
            <td>{{item.desc}}</td>
            <td>{{item.isDel}}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

可通过地址栏更换分页数字查看效果。

查询集的缓存

每个查询集都包含一个缓存,来最小化的对数据库访问。

在新的查询集中,缓存首次为空;第一次对查询集求值,会发生数据缓存,django会将查询出来的数据做缓存,并返回查询结果;之后的查询直接使用查询集缓存。

字段查询

实现了sql中的where语句,作为方法filter()、exclude()、get()的参数

语法:属性名称__比较运算符=值

外键:属性名_id

转义:like语句中使用%是为了匹配占位,匹配数据中的%(where like ‘\%’)

student = Students.stuObj2.filter(name__contains='李%')
print(student)

可用于匹配%号,而不需要转义

比较运算符

exact

完全匹配运算符。由于完全匹配的使用频率最高,因此Django将exact定义为默认查询条件,如果在过滤语句中没有指定查询条件,那么Django将按照完全匹配查找数据。

如:

filter(isDel=False)

等价于

filter(isDel_exact=False)

contains 

是否包含,大小写敏感

Students.stuObj2.filter(name__contains='张')

startswith、endswith

以value开头或结尾,大小写敏感

Students.stuObj2.filter(name__startswith='张')

注意:以上四个在前面加上i,就标识不区分大小写如iexact、icontains、istartswith/iendswith

isnull、isnotnull

对应SQL语句的IS NULL和IS NOT NULL,可接收参数值为True、False。

例如名称不为空的学生:

Students.stuObj2.filter(name__isnull=False)

in

是否包含在范围内。

示例:

Students.stuObj2.filter(pk__in=[1, 2, 3, 4])

range

字段值出现在一个区间中。

示例:

start_date = datetime.datetime(2023, 4, 22)
end_date = datetime.datetime(2023, 4, 24)
Grades.objects.filter(create_time__range=(start_date, end_date))

gt 大于

gte 大于等于

lt 小于

lte 小于等于

student = Students.stuObj2.filter(age__gt=30)

year、month、day、week_day、hour、minute、second

grades = Grades.objects.filter(create_time__year=2023)

跨关联查询

处理join查询

语法:模型类名__属性名__比较运算符

Grades.objects.filter(students__desc__contains='天山')

查询学生描述中带有天山这两个字数据是属于哪个班级

聚合函数

使用aggregate()函数返回聚合函数的值

avg、count、max、min、sum

引入Max

from django.db.models import Max

计算学生中年龄最大的

student = Students.stuObj2.aggregate(Max('age'))

结果:

F对象

可以使用模型的A属性与B属性进行比较

引入F对象

from django.db.models import F

使用示例

Grades.objects.filter(girl_num__gt=F('boy_num'))

还支持f对象的算术运算,时间的运算

Grades.objects.filter(girl_num__gt=F('boy_num')+10)

Q对象

概述:过滤器的方法中的关键字参数,条件为and模式

需求:进行or查询

解决:使用Q对象

引入Q对象

from django.db.models import Q

使用Q对象 取id大于3 或者 age大于30的学生

students = Students.stuObj2.filter(Q(pk__gt=3) | Q(age__gte=30))

注意:只有一个Q对象,即匹配当前条件。

students = Students.stuObj2.filter(Q(pk__lte=3))

加波浪线,表示取反

students = Students.stuObj2.filter(~Q(pk__lte=3))

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

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

相关文章

【Vue学习笔记5】Vue3中的响应式:ref和reactive、watchEffect和watch

所谓响应式就是界面和数据同步&#xff0c;能实现实时更新。 Vue 中用过三种响应式解决方案&#xff0c;分别是 defineProperty、Proxy 和 value setter。Vue 2 使用的方案是 defineProperty API。Vue3中使用的方案是Proxy和value setter。 1. ref和reactive vue3中实现响应…

基于docker部署ELK实战- ELK文章1

选择版本为elasticsearch:7.17.9&#xff0c;kibana:7.17.9&#xff0c;logstash:7.17.9 版本一定要一致 docker hub地址&#xff1a;https://hub.docker.com elk相关文档&#xff1a;https://www.elastic.co/guide/en/kibana/7.17 一、部署单点es 1.创建网络 因为我们还需要…

iframe嵌套grafana (前端视角)

1、grafana 启动方式 ①.grafana目录鉴赏。咱们就是直接拿到配置好的grafana。咱们暂时不涉及配置数据啥。 ①.双击grafana-server.exe &#xff0c;会出现黑色命令框。 ②.在浏览器中访问 http://localhost:3000 此时就可以看到配置好的grafana 2.前端嵌入 ①.html <…

消息队列中间件 - Docker安装RabbitMQ、AMQP协议、和主要角色

概述 不管是微服务还是分布式的系统架构中&#xff0c;消息队列中间件都是不可缺少的一个重要环节&#xff0c;主流的消息队列中间件有RabbitMQ、RocketMQ等等&#xff0c;从这篇开始详细介绍以RabbitMQ为代表的消息队列中间件。 AMQP协议 AMQP协议是一个提供统一消息服务的应…

图像处理:基于cv2.inpaint()图像修补

前言 今天我们将学习如何通过一种“修复”的方法消除旧照片中的小噪音&#xff0c;笔画等。当然&#xff0c;经过我的测试你也可以将其用于削弱混杂了其他的颜色的图像。 实验背景 大多数人家都会有一些旧的的旧化照片&#xff0c;上面有黑点&#xff0c;一些笔触等。你是否…

从零实现深度学习框架——常见学习率调整策略原理与实现

引言 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架&#xff0c;该框架类似PyTorch能实现自动求导。 &#x1f4a1;系列文章完整目录&#xff1a; &#x1f449;点此&#x1f448; 要深入理解…

day24_多线程

今日内容 零、 复习昨日 一、作业 二、线程安全的集合 三、死锁 四、线程通信 五、生产者消费者 六、线程池 零、 复习昨日 见晨考 一、作业 售卖后车票 见代码二、线程安全的类[了解] StringBuffer是线程安全的,是因为每个方法都加上synchronized,即都是同步方法 StringBuil…

【前端】前后端分离ruoyi-vue初步学习

1.了解vue基础知识。 Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 2.将ruoyi-vue项目拉下来&#xff0c;并成功运行。 开源项目网址&#xff1a;RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|…

《Netty》从零开始学netty源码(五十四)之PoolThreadLocalCache

PoolThreadLocalCache 前面讲到PoolThreadCache&#xff0c;它为线程提供内存缓存&#xff0c;当线程需要分配内存时可快速从其中获取&#xff0c;在Netty中用PoolThreadLocalCache来管理PoolThreadCache&#xff0c;它的数据结构如下&#xff1a; PoolThreadLocalCache相当…

【网络】UDP网络服务器简单模拟实现

【网络】UDP网络服务器简单模拟实现 文章目录 makefile服务端udpServerudpServer.ccudpServer.hpp初始化启动测试 客户端udpClientudpClient.ccudpClient.hpp初始化启动 整体代码 UDP的封装: UDP网络服务器模拟实现&#xff1a;主要分为makefile文件进行编译 UDP客户端&#xf…

Java开发 - 不知道算不算详细的分布式事务详解

前言 前日对JUC进行了一个深度总结&#xff0c;不过现在博主能记得的也不多了&#xff0c;只是这东西&#xff0c;不是看几遍写几遍就能完全记住的&#xff0c;功夫在平时&#xff0c;很多知识点都需要反复的看&#xff0c;不光要看&#xff0c;还要用&#xff0c;这样才能了解…

在CentOS上安装Jenkins并配置Docker

文章目录 步骤1 - 安装Java 11步骤2 - 安装Jenkins步骤3 - 安装Docker步骤4 - 配置Docker Cloud步骤 5 - 验证步骤 6 - 可能会遇到的问题 在本教程中&#xff0c;我们将展示如何在CentOS上安装Jenkins和Docker&#xff0c;并将它们配置在同一台机器上&#xff0c;使Jenkins能够…

《花雕学AI》WeTab+ChatGPT:让浏览器变成你的智能助手

引言&#xff1a; 浏览器是我们日常使用的最重要的工具之一&#xff0c;它可以帮助我们获取信息、娱乐、学习、工作等。但是&#xff0c;传统的浏览器往往不能满足我们的个性化需求&#xff0c;也不能给我们提供智能化的服务。那么&#xff0c;有没有一种浏览器可以让我们的体…

yoloV2细节改进

文章目录 1 v2 细节升级概述2 .网络结构特点3. 架构细节解读4. 基于聚类来选择先验框尺寸5. 偏移量计算方法6. 坐标映射与还原7 感受野8. 特征融合的改进其他知识点filter 是什么&#xff1f; 1 v2 细节升级概述 2 .网络结构特点 使用dropout&#xff0c;杀死部分神经元&#…

Java集合之单列集合

分类 集合分为单列集合&#xff08;Collection&#xff09;和双列集合&#xff08;Map&#xff09; 单列集合的体系结构 List集合和Set集合的区别 List系列集合&#xff1a;添加元素是有序的&#xff08;添加的顺序&#xff0c;而非数据的大小顺序&#xff09;、可重复、有索引…

为什么在Ubuntu系统使用附加驱动更新Nvidia显卡驱动不起作用

1. 硬件环境 CPU&#xff1a;AMD Ryzen 9 5950x 16-core processor 32 GPU&#xff1a;双GeForce RTX 3090 操作系统&#xff1a;Ubuntu 22.04.2 LTS 64 位 主板&#xff1a;ASUS的ROG CROSSHAIR VIII EXTREME 2. 问题描述 使用上图所示的附加驱动程序更新Nvidia显卡驱动&am…

恢复item2和oh-my-zsh的配置

1. 首先正常安装item2 2. 加载onedrive里的传家宝iterm2_default_profile.json&#xff0c;让iterm2的配置生效 2. 然后正常安装oh-my-zsh (官方步骤&#xff1a; sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&q…

C# 学习abstract

abstract 顾名思义&#xff1a;抽象 从微软官方文档来看&#xff1a;abstract 修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符来指示某个类仅用作其他类的基类&#xff0c;而不用于自行进行…

linux内核调试的几个方法

参考 以下内容&#xff1a; Linux 笔记&#xff1a; https://xuesong.blog.csdn.net/article/details/109522945?spm1001.2014.3001.5502 printk: printk在内核源码中用来记录日志信息的函数&#xff0c;只能在内核源码范围内使用。用法和printf非常相似&#xff1b; printk…

InsCode体验报告

文章目录 前言一、InsCode是什么&#xff1f;二、体验过程1.创建项目2.在线IDE3.运行和部署项目4.浏览和学习项目5.分享和协作项目6.支持AI助手 三、体验感受优点缺点 总结 官方宣传视频 InsCode-AI 前言 作为一个大三计算机专业的学生&#xff0c;我对编程有着浓厚的兴趣和热…