【Django】执行查询——比较、删除、复制、批量修改对象

以下述模型为基础,讨论检索对象的方式方法:

from datetime import datefrom django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=200)email = models.EmailField()def __str__(self):return self.nameclass Entry(models.Model):blog = models.ForeignKey(Blog, on_delete=models.CASCADE)headline = models.CharField(max_length=255)body_text = models.TextField()pub_date = models.DateField()mod_date = models.DateField(default=date.today)authors = models.ManyToManyField(Author)number_of_comments = models.IntegerField(default=0)number_of_pingbacks = models.IntegerField(default=0)rating = models.IntegerField(default=5)def __str__(self):return self.headline

比较对象

要比较两个模型实例,使用标准的 Python 比较操作符,两个等号: ==。实际上,这比较了两个模型实例的主键值。

示例如下,两个比较是等效的。需要注意的是,有的情况下模型的主键可能不是id,可能是别的字段名称,但本质都是在比较主键。

>>> some_entry == other_entry
>>> some_entry.id == other_entry.id

删除对象

删除单个对象实例

删除方法方便地被命名为delete()。这个方法立即删除对象并返回被删除的对象数以及一个包含每种对象类型的删除数的字典。

>>> e.delete()
(1, {'blog.Entry': 1})

批量删除对象实例

所有 QuerySet 都有个 delete() 方法,它会删除 QuerySet 中的所有成员。

>>> Entry.objects.filter(pub_date__year=2005).delete()
(5, {'webapp.Entry': 5})

要删除某个模型的所有对象,要查询得到包含所有对象的 QuerySet,在QuerySet 上使用 delete() 方法

Entry.objects.all().delete()

如何复制模型实例

新建一个模型实例,保存后,将 pk 设置为 None 并将 _state.adding 设置为 True,再次保存就实现了“复制”。

blog = Blog(name="My blog", tagline="Blogging is easy")
blog.save()  # blog.pk == 1blog.pk = None
blog._state.adding = True
blog.save()  # blog.pk == 2

如果模型继承自另一个模型,则还要将id设置为None。

class ThemeBlog(Blog):theme = models.CharField(max_length=200)django_blog = ThemeBlog(name="Django", tagline="Django is easy", theme="python")
django_blog.save()  # django_blog.pk == 3django_blog.pk = None
django_blog.id = None
django_blog._state.adding = True
django_blog.save()  # django_blog.pk == 4

如果模型还有 ManyToManyField 关联关系,OneToOneField 关联关系,要重新配置。

批量修改对象

通过 update() 统一设置 QuerySet 中的所有对象的某个字段。注意此方法设置非关联字段和 ForeignKey 字段。要更新非关联字段,请将新值提供为常数。要更新 ForeignKey 字段,请将新值设置为要指向的新模型实例。

# 更新所有pub_date在2007年的Entry,headline修改为"Everything is the same"。
Entry.objects.filter(pub_date__year=2007).update(headline="Everything is the same")

update() 方法会立即应用,并返回查询匹配的行数。
对于要更新的 QuerySet 唯一的限制是它只能访问一个数据库表:模型的主表。您可以基于相关字段进行过滤,但只能更新模型的主表中的列。

对于调用 update 的情况,还可以使用 F 表达式 来根据模型中另一个字段的值来更新字段。这在根据当前值增加计数器时特别有用。例如,要增加博客中每篇文章的 pingback 计数:

>>> Entry.objects.update(number_of_pingbacks=F("number_of_pingbacks") + 1)

在更新中使用 F() 对象时,不能引入连接。

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

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

相关文章

【vue】v-if、v-show、v-for 相关所有面试题总结

v-if 和 v-show 的区别 两个重点【dom】和【生命周期】 v-if 惰性指令,false 不会被编译、渲染不会存在 DOM 中切换开销大,需要重新创建元素值变化,使用 v-if 的组件生命周期执行顺序 true 变为 false【组件的销毁】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可视化管理存储的key和value类型

shared_preferences 是一个Flutter插件,它提供了一种简单的方式来在应用程序中存储和获取持久化的键值对数据。它可以用于存储应用程序的配置信息、用户偏好设置、登录状态等。 使用 shared_preferences 插件,你可以在应用程序中轻松地保存和读取数据&a…

Java中线程相关的知识

创建子线程的三种方式: 1.自定义线程任务类继承线程类,以便继承其功能,重写其run方法(里面写自己需要实现的功能),在main方法调用时创建其任务类实例化对象,然后调用对象的start方法(继承自父类),即成功创建线程 优点:创建方式简…

Pandas DataFrame 基本操作实例100个

Pandas 是一个基于NumPy的数据分析模块,最初由AQR Capital Management于2008年4月开发,并于2009年底开源。Pandas的名称来源于“Panel Data”(面板数据)和“Python数据分析”(data analysis)。这个库现在由…

来不及了!大学必须完成的四件事!

老师们常说,上大学就轻松了 其实不然 大学不是人生的终点,而是新的起跑线 不是休息站,而是进入社会的最后冲刺跑道 大学生活苦乐参半,成人世界即将来临 出了校门,你会发现社会复杂多变,需要不断学习 稍…

excel中如何使用VLOOKUP和EXACT函数实现区分大小写匹配数据

在 Excel 中,VLOOKUP 函数默认情况下是不区分大小写的: 比如下面的案例,直接使用VLOOKUP函数搜索,只会搜索匹配到不区分大小写的第一个 如果我们想要实现区分大小写的精确匹配,可以使用 EXACT 函数结合 VLOOKUP 函数 …

【简说八股】Redisson的守护线程是怎么实现的

Redisson Redisson 是一个 Java 语言实现的 Redis SDK 客户端,在使用分布式锁时,它就采用了「自动续期」的方案来避免锁过期,这个守护线程我们一般也把它叫做「看门狗」线程。 Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实…

PyTorch-卷积神经网络

卷积神经网络 基本结构 首先解释一下什么是卷积,这个卷积当然不是数学上的卷积,这里的卷积其实表示的是一个三维的权重,这么解释起来可能不太理解,我们先看看卷积网络的基本结构。 通过上面的图我们清楚地了解到卷积网络和一般网…

【Javascript】设计模式之发布订阅模式

文章目录 1、现实中的发布-订阅模式2、DOM 事件3、简单的发布-订阅模式4、通用的发布-订阅模式5、先发布再订阅6、小结 发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于…

Mysql深入学习 基础篇 Ss.02 详解四类SQL语句

我亲爱的对手,亦敌亦友,但我同样希望你能成功,与我一起,站在人生的山顶上 ——24.3.1 一、DDL 数据定义语言 1.DDL —— 数据库操作 查询 查询所有数据库 show databases; 查询当前数据库 select database(); 创建 create databa…

【简说八股】Nginx、GateWay、Ribbon有什么区别?

前言 在现代的微服务架构中,Nginx、Gateway 和 Ribbon 都是处理网络请求和服务的组件,但它们各自扮演的角色和提供的功能有所不同。下面我将详细解释它们之间的区别: Nginx Nginx 是一个高性能的 HTTP 和反向代理服务器,它也可…

Golang Vs Java:为您的下一个项目选择正确的工具

Java 首次出现在 1995 年,由 James Gosling 和 Sun Microsystems 的其他人开发的一种新编程语言。从那时起,Java 已成为世界上最受欢迎和广泛使用的编程语言之一。Java 的主要特点包括其面向对象的设计、健壮性、平台独立性、自动内存管理以及广泛的内置…

MSMFN

CDFI是彩色多普勒血流成像 辅助信息 作者未提供数据

Codeforces Round 930 (Div. 2)

substr时间复杂度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;会超时 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL树怎么转

AVL树是啥 一提到AVL树&#xff0c;脑子里不是旋了&#xff0c;就是悬了。 AVL树之所以难&#xff0c;并不是因为结构难以理解&#xff0c;而是因为他的旋转。 AVL树定义 平衡因子&#xff1a;对于一颗二叉树&#xff0c;某节点的左右子树高度之差&#xff0c;就是该节点的…

5、云原生安全之falco的规则解读(部分)(上)

文章目录 1、自定义规则测试1.1、自定义检测定时任务的规则2、自带规则详解部分2.1、意外的出站连接源(类似的还有入站连接)2.2、检测目录穿越攻击2.3、rpm数据库被修改2.4、数据库派生新的进程2.5、特权容器启动2.6、启动容器挂载到敏感路径2.7、匹配所有在pod内启动、并连接…

音视频数字化(数字与模拟-照相机)

目录 1、模拟/数字 2、第一台照相机 3、照相机原理 4、取景方式 5、底片 6、数码相机 7、数码相机指标 8、数码相机分类 (1)单反相机 (2)单电相机 (3)无反相机

2024.03.02蓝桥云课笔记

1.scanf与printf取消分隔符的限制方法 示例代码&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 运行&#xff1a; 输入&#xff1a;Hello World 输出&#xff1a;Hello World 注&#xff1a;其中[]中是一个正则…

(UE4升级UE5)Selected Level Actor节点升级到UE5

本问所用工具为&#xff1a;AssetDeveTool虚幻开发常用工具https://gf.bilibili.com/item/detail/1104960041 在UE4中 编辑器蓝图有个节点为 Get Selected Level Actors 但在UE5中&#xff0c;蓝图直接升级后&#xff0c;节点失效&#xff0c;如图&#xff1a; 因为在UE5中&am…

Vue3中Vuex状态管理库学习笔记

1.什么是状态管理 在开发中&#xff0c;我们会的应用程序需要处理各种各样的数据&#xff0c;这些数据需要保存在我们应用程序的某个位置&#xff0c;对于这些数据的管理我们就称之为状态管理。 在之前我们如何管理自己的状态呢&#xff1f; 在Vue开发中&#xff0c;我们使用…