更新多個物件
例如說我們現在想要將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()
|
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/189845.html
標籤:Python
上一篇:提升PHP執行效率的一些小細節
下一篇:Django如何連接mysql
