更新多個對象 例如說我們現在想要將Apress Publisher的名稱由原來的”Apress”更改為”Apress Publishing”。若使用save()方法,如: ? 1 2 3 >>> p = Publisher.objects.get(name='Apress') >>> p.name ...
更新多個對象
例如說我們現在想要將Apress Publisher的名稱由原來的”Apress”更改為”Apress Publishing”。若使用save()方法,如:
?1 2 3 |
>>> p = Publisher.objects.get(name = 'Apress' )
>>> p.name = 'Apress Publishing'
>>> p.save()
|
這等同於如下SQL語句:
?1 2 3 4 5 6 7 8 9 10 11 12 |
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()方法: 示例如下:
?1 |
>>> Publisher.objects. filter ( id = 52 ).update(name = 'Apress Publishing' )
|
與之等同的SQL語句變得更高效,並且不會引起競態條件。
?1 2 3 |
UPDATE books_publisher
SET name = 'Apress Publishing'
WHERE id = 52;
|
update()方法對於任何結果集(QuerySet)均有效,這意味著你可以同時更新多條記錄。 以下示例演示如何將所有Publisher的country欄位值由'U.S.A'更改為'USA':
?1 2 |
>>> Publisher.objects. all ().update(country = 'USA' )
2
|
update()方法會返回一個整型數值,表示受影響的記錄條數。 在上面的例子中,這個值是2。
刪除對象
刪除資料庫中的對象只需調用該對象的delete()方法即可:
?1 2 3 4 |
>>> p = Publisher.objects.get(name = "O'Reilly" )
>>> p.delete()
>>> Publisher.objects. all ()
[<Publisher: Apress Publishing>]
|
同樣我們可以在結果集上調用delete()方法同時刪除多條記錄。這一點與我們上一小節提到的update()方法相似:
?1 2 3 4 |
>>> Publisher.objects. filter (country = 'USA' ).delete()
>>> Publisher.objects. all ().delete()
>>> Publisher.objects. all ()
[]
|
刪除數據時要謹慎! 為了預防誤刪除掉某一個表內的所有數據,Django要求在刪除表內所有數據時顯示使用all()。 比如,下麵的操作將會出錯:
?1 2 3 4 |
>>> Publisher.objects.delete()
Traceback (most recent call last):
File "<console>" , line 1 , in <module>
AttributeError: 'Manager' object has no attribute 'delete'
|
而一旦使用all()方法,所有數據將會被刪除:
?1 |
>>> Publisher.objects. all ().delete()
|
如果只需要刪除部分的數據,就不需要調用all()方法。再看一下之前的例子:
?1 |
>>> Publisher.objects. filter (country = 'USA' ).delete()
|