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数据清洗系列之字符串处理详解
Feb 12 Python
python数据结构之列表和元组的详解
Sep 23 Python
Python 错误和异常代码详解
Jan 29 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
Python实现的批量修改文件后缀名操作示例
Dec 07 Python
Python中bisect的使用方法
Dec 31 Python
如何通过python实现人脸识别验证
Jan 17 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
Django vue前后端分离整合过程解析
Nov 20 Python
python excel和yaml文件的读取封装
Jan 12 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
python识别围棋定位棋盘位置
Jul 26 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 数组使用详解 推荐
2011/06/02 PHP
PHP获取ip对应地区和使用网络类型的方法
2015/03/11 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
简单实现js选项卡切换效果
2016/02/03 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
JQuery validate 验证一个单独的表单元素实例
2017/02/17 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
基于JavaScript中字符串的match与replace方法(详解)
2017/12/04 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python cookielib 登录人人网的实现代码
2012/12/19 Python
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python requests库爬取豆瓣电视剧数据并保存到本地详解
2019/08/10 Python
django 实现celery动态设置周期任务执行时间
2019/11/19 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
如何完美的建立一个python项目
2020/10/09 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
总经理文秘岗位职责
2014/02/03 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
学员自我鉴定
2014/03/19 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
找工作求职信
2014/07/07 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
孝女彩金观后感
2015/06/10 职场文书
运动员代表致辞
2015/07/29 职场文书
element多个表单校验的实现
2021/05/27 Javascript
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python