在Python的Django框架中更新数据库数据的方法


Posted in Python onJuly 17, 2015

先使用一些关键参数创建对象实例,如下:

>>> p = Publisher(name='Apress',
...     address='2855 Telegraph Ave.',
...     city='Berkeley',
...     state_province='CA',
...     country='U.S.A.',
...     website='http://www.apress.com/')

这个对象实例并 没有 对数据库做修改。 在调用`` save()`` 方法之前,记录并没有保存至数据库,像这样:

>>> p.save()

在SQL里,这大致可以转换成这样:

INSERT INTO books_publisher
  (name, address, city, state_province, country, website)
VALUES
  ('Apress', '2855 Telegraph Ave.', 'Berkeley', 'CA',
   'U.S.A.', 'http://www.apress.com/');

因为 Publisher 模型有一个自动增加的主键 id ,所以第一次调用 save() 还多做了一件事: 计算这个主键的值并把它赋值给这个对象实例:

>>> p.id
52  # this will differ based on your own data

接下来再调用 save() 将不会创建新的记录,而只是修改记录内容(也就是 执行 UPDATE SQL语句,而不是 INSERT 语句):

>>> p.name = 'Apress Publishing'
>>> p.save()

前面执行的 save() 相当于下面的SQL语句:

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;

注意,并不是只更新修改过的那个字段,所有的字段都会被更新。 这个操作有可能引起竞态条件,这取决于你的应用程序。 请参阅后面的“更新多个对象”小节以了解如何实现这种轻量的修改(只修改对象的部分字段)。

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

选择对象

当然,创建新的数据库,并更新之中的数据是必要的,但是,对于 Web 应用程序来说,更多的时候是在检索查询数据库。 我们已经知道如何从一个给定的模型中取出所有记录:

>>> Publisher.objects.all()
[<Publisher: Apress>, <Publisher: O'Reilly>]

这相当于这个SQL语句:

SELECT id, name, address, city, state_province, country, website
FROM books_publisher;

注意

注意到Django在选择所有数据时并没有使用 SELECT* ,而是显式列出了所有字段。 设计的时候就是这样: SELECT* 会更慢,而且最重要的是列出所有字段遵循了Python 界的一个信条: 明言胜于暗示。

有关Python之禅(戒律) :-),在Python提示行输入 import this 试试看。

让我们来仔细看看 Publisher.objects.all() 这行的每个部分:

  •     首先,我们有一个已定义的模型 Publisher 。没什么好奇怪的: 你想要查找数据, 你就用模型来获得数据。
  •     然后,是objects属性。 它被称为管理器,我们将在第10章中详细讨论它。 目前,我们只需了解管理器管理着所有针对数据包含、还有最重要的数据查询的表格级操作。
  •     所有的模型都自动拥有一个 objects 管理器;你可以在想要查找数据时使用它。
  •     最后,还有 all() 方法。这个方法返回返回数据库中所有的记录。 尽管这个对象 看起来 象一个列表(list),它实际是一个 QuerySet 对象, 这个对象是数据库中一些记录的集合。
Python 相关文章推荐
python中反射用法实例
Mar 27 Python
Python实现股市信息下载的方法
Jun 15 Python
python查看微信好友是否删除自己
Dec 19 Python
Python 高级专用类方法的实例详解
Sep 11 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
python在线编译器的简单原理及简单实现代码
Feb 02 Python
Python远程视频监控程序的实例代码
May 05 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
pow在python中的含义及用法
Jul 11 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
Python爬虫之爬取最新更新的小说网站
May 06 Python
在Django框架中运行Python应用全攻略
Jul 17 #Python
Python的Django框架中的数据库配置指南
Jul 17 #Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 #Python
在Django的视图中使用数据库查询的方法
Jul 16 #Python
详解Python的Django框架中的模版继承
Jul 16 #Python
Django中模版的子目录与include标签的使用方法
Jul 16 #Python
Django中使用locals()函数的技巧
Jul 16 #Python
You might like
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
js时间比较 js计算时间差的简单实现方法
2016/08/26 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
express框架下使用session的方法
2019/07/31 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
web.py获取上传文件名的正确方法
2014/08/26 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
简单介绍Python下自己编写web框架的一些要点
2015/04/29 Python
python中PIL安装简单教程
2016/04/21 Python
基于Python函数的作用域规则和闭包(详解)
2017/11/29 Python
Python 12306抢火车票脚本
2018/02/07 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
python交互界面的退出方法
2019/02/16 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
python中栈的原理及实现方法示例
2019/11/27 Python
辩论赛主持词
2014/03/18 职场文书
岗位说明书范文
2014/05/07 职场文书
婚前协议书标准版
2014/10/19 职场文书
2014年内勤工作总结
2014/11/24 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
2016年度继续教育学习心得体会
2016/01/19 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js