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字符遍历的艺术
Sep 06 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
深入解析Python中的descriptor描述器的作用及用法
Jun 27 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python装饰器的执行过程实例分析
Jun 04 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
Jun 24 Python
Python3中的tuple函数知识点讲解
Jan 03 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
学点简单的Django之第一个Django程序的实现
Feb 24 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 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
Js 中debug方式
2010/02/07 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
webstorm+vue初始化项目的方法
2018/10/18 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
python使用xmlrpclib模块实现对百度google的ping功能
2015/06/02 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
python如何使用腾讯云发送短信
2020/09/17 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
俄罗斯第一家篮球店:StreetBall
2020/07/30 全球购物
介绍一下Linux文件的记录形式
2013/09/29 面试题
提拔干部考察材料
2014/05/26 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
毕业论文致谢信
2015/05/14 职场文书
婚礼父母致辞
2015/07/28 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
执行力心得体会范文
2016/01/11 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书
php双向队列实例讲解
2021/11/17 PHP