Django中更新多个对象数据与删除对象的方法


Posted in Python onJuly 17, 2015

更新多个对象

例如说我们现在想要将Apress Publisher的名称由原来的”Apress”更改为”Apress Publishing”。若使用save()方法,如:

>>> p = Publisher.objects.get(name='Apress')
>>> p.name = 'Apress Publishing'
>>> p.save()

这等同于如下SQL语句:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = 'Apress';

UPDATE books_publisher SET
  name = 'Apress Publishing',
  address = '2855 Telegraph Ave.',
  city = 'Berkeley',
  state_province = 'CA',
  country = 'U.S.A.',
  website = 'http://www.apress.com'
WHERE id = 52;

(注意在这里我们假设Apress的ID为52)

在这个例子里我们可以看到Django的save()方法更新了不仅仅是name列的值,还有更新了所有的列。 若name以外的列有可能会被其他的进程所改动的情况下,只更改name列显然是更加明智的。 更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法: 示例如下:

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')

与之等同的SQL语句变得更高效,并且不会引起竞态条件。

UPDATE books_publisher
SET name = 'Apress Publishing'
WHERE id = 52;

update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录。 以下示例演示如何将所有Publisher的country字段值由'U.S.A'更改为'USA':

>>> Publisher.objects.all().update(country='USA')
2

update()方法会返回一个整型数值,表示受影响的记录条数。 在上面的例子中,这个值是2。
删除对象

删除数据库中的对象只需调用该对象的delete()方法即可:

>>> p = Publisher.objects.get(name="O'Reilly")
>>> p.delete()
>>> Publisher.objects.all()
[<Publisher: Apress Publishing>]

同样我们可以在结果集上调用delete()方法同时删除多条记录。这一点与我们上一小节提到的update()方法相似:

>>> Publisher.objects.filter(country='USA').delete()
>>> Publisher.objects.all().delete()
>>> Publisher.objects.all()
[]

删除数据时要谨慎! 为了预防误删除掉某一个表内的所有数据,Django要求在删除表内所有数据时显示使用all()。 比如,下面的操作将会出错:

>>> Publisher.objects.delete()
Traceback (most recent call last):
 File "<console>", line 1, in <module>
AttributeError: 'Manager' object has no attribute 'delete'

而一旦使用all()方法,所有数据将会被删除:

>>> Publisher.objects.all().delete()

如果只需要删除部分的数据,就不需要调用all()方法。再看一下之前的例子:

>>> Publisher.objects.filter(country='USA').delete()

Python 相关文章推荐
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python PyQt5标准对话框用法示例
Aug 23 Python
解决pandas 作图无法显示中文的问题
May 24 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python 一句话生成字母表的方法
Jan 02 Python
Django框架实现分页显示内容的方法详解
May 10 Python
Django框架视图函数设计示例
Jul 29 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
opencv3/Python 稠密光流calcOpticalFlowFarneback详解
Dec 11 Python
python 对xml解析的示例
Feb 27 Python
python如何利用traceback获取详细的异常信息
Jun 05 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 #Python
Django中对数据查询结果进行排序的方法
Jul 17 #Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 #Python
Python的Django框架中的数据过滤功能
Jul 17 #Python
在Python的Django框架中更新数据库数据的方法
Jul 17 #Python
在Django框架中运行Python应用全攻略
Jul 17 #Python
Python的Django框架中的数据库配置指南
Jul 17 #Python
You might like
php查询mysql大量数据造成内存不足的解决方法
2015/03/04 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
js简易版购物车功能
2017/06/17 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
使用graphics.py实现2048小游戏
2015/03/10 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
Python 转义字符详细介绍
2017/03/21 Python
基于python指定包的安装路径方法
2018/10/27 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
python 一维二维插值实例
2020/04/22 Python
Hotels.com印度:酒店预订
2019/05/11 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
年度考核自我鉴定
2013/11/09 职场文书
人资专员岗位职责
2014/04/04 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
班级标语大全
2014/06/21 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
影视后期实训报告
2014/11/05 职场文书
节水倡议书
2015/01/19 职场文书
八年级上册语文教学计划
2015/01/22 职场文书
拉贝日记观后感
2015/06/05 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
go:垃圾回收GC触发条件详解
2021/04/24 Golang
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
如何使用SQL Server语句创建表
2022/04/12 SQL Server
Java后端 Dubbo retries 超时重试机制的解决方案
2022/04/14 Java/Android