在Python的Django框架中更新数据库数据的方法
先使用一些关键参数创建对象实例,如下:
>>>p=Publisher(name='Apress', ...address='2855TelegraphAve.', ...city='Berkeley', ...state_province='CA', ...country='U.S.A.', ...website='http://www.apress.com/')
这个对象实例并没有对数据库做修改。在调用``save()``方法之前,记录并没有保存至数据库,像这样:
>>>p.save()
在SQL里,这大致可以转换成这样:
INSERTINTObooks_publisher (name,address,city,state_province,country,website) VALUES ('Apress','2855TelegraphAve.','Berkeley','CA', 'U.S.A.','http://www.apress.com/');
因为Publisher模型有一个自动增加的主键id,所以第一次调用save()还多做了一件事:计算这个主键的值并把它赋值给这个对象实例:
>>>p.id 52#thiswilldifferbasedonyourowndata
接下来再调用save()将不会创建新的记录,而只是修改记录内容(也就是执行UPDATESQL语句,而不是INSERT语句):
>>>p.name='ApressPublishing' >>>p.save()
前面执行的save()相当于下面的SQL语句:
UPDATEbooks_publisherSET name='ApressPublishing', address='2855TelegraphAve.', city='Berkeley', state_province='CA', country='U.S.A.', website='http://www.apress.com' WHEREid=52;
注意,并不是只更新修改过的那个字段,所有的字段都会被更新。这个操作有可能引起竞态条件,这取决于你的应用程序。请参阅后面的“更新多个对象”小节以了解如何实现这种轻量的修改(只修改对象的部分字段)。
UPDATEbooks_publisherSET name='ApressPublishing' WHEREid=52;
选择对象
当然,创建新的数据库,并更新之中的数据是必要的,但是,对于Web应用程序来说,更多的时候是在检索查询数据库。我们已经知道如何从一个给定的模型中取出所有记录:
>>>Publisher.objects.all() [<Publisher:Apress>,<Publisher:O'Reilly>]
这相当于这个SQL语句:
SELECTid,name,address,city,state_province,country,website FROMbooks_publisher;
注意
注意到Django在选择所有数据时并没有使用SELECT*,而是显式列出了所有字段。设计的时候就是这样:SELECT*会更慢,而且最重要的是列出所有字段遵循了Python界的一个信条:明言胜于暗示。
有关Python之禅(戒律):-),在Python提示行输入importthis试试看。
让我们来仔细看看Publisher.objects.all()这行的每个部分:
- 首先,我们有一个已定义的模型Publisher。没什么好奇怪的:你想要查找数据,你就用模型来获得数据。
- 然后,是objects属性。它被称为管理器,我们将在第10章中详细讨论它。目前,我们只需了解管理器管理着所有针对数据包含、还有最重要的数据查询的表格级操作。
- 所有的模型都自动拥有一个objects管理器;你可以在想要查找数据时使用它。
- 最后,还有all()方法。这个方法返回返回数据库中所有的记录。尽管这个对象看起来象一个列表(list),它实际是一个QuerySet对象,这个对象是数据库中一些记录的集合。