django 數據庫的一些操作
1.數據過濾:
使用filter()方法
>>> Publisher.objects.filter(name=‘Apress‘)
[<Publisher: Apress>]
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name = ‘Apress‘;
>>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
[<Publisher: Apress>]
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE country = ‘U.S.A.‘ AND state_province = ‘CA‘;
>>> Publisher.objects.filter(name__contains="press") [<Publisher: Apress>] 相當於
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE name LIKE ‘%press%‘;
2.獲取單個對象 get()方法
>>> Publisher.objects.get(name="Apress") <Publisher: Apress>
try: p = Publisher.objects.get(name=‘Apress‘) except Publisher.DoesNotExist: print "Apress isn‘t in the database yet." else: print "Apress is in the database."
可以進行異常處理,捕捉錯誤
3.數據排序 使用order_by()方法
>>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O‘Reilly>]
如果需要以多個字段為標準進行排序(第二個字段會在第一個字段的值相同的情況下被使用到),使用多個參數就可以了,如下:
>>> Publisher.objects.order_by("state_province", "address") [<Publisher: Apress>, <Publisher: O‘Reilly>]
我們還可以指定逆向排序,在前面加一個減號 - 前綴:
>>> Publisher.objects.order_by("-name") [<Publisher: O‘Reilly>, <Publisher: Apress>]
缺省排序:
Django讓你可以指定模型的缺省排序方式:
class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() def __unicode__(self): return self.name **class Meta:** **ordering = [‘name‘]**
現在,讓我們來接觸一個新的概念。 class Meta,內嵌於 Publisher 這個類的定義中(如果 class Publisher 是頂格的,那麽 class Meta 在它之下要縮進4個空格--按 Python 的傳統 )。你可以在任意一個 模型 類中使用 Meta 類,來設置一些與特定模型相關的選項。 在 附錄B 中有 Meta 中所有可選項的完整參考,現在,我們關註 ordering 這個選項就夠了。 如果你設置了這個選項,那麽除非你檢索時特意額外地使用了 order_by(),否則,當你使用 Django 的數據庫 API 去檢索時,Publisher對象的相關返回值默認地都會按 name 字段排序。
4.連鎖查詢:
我們已經知道如何對數據進行過濾和排序。 當然,通常我們需要同時進行過濾和排序查詢的操作。 因此,你可以簡單地寫成這種“鏈式”的形式:
>>> Publisher.objects.filter(country="U.S.A.").order_by("-name") [<Publisher: O‘Reilly>, <Publisher: Apress>]
你應該沒猜錯,轉換成SQL查詢就是 WHERE 和 ORDER BY 的組合:
SELECT id, name, address, city, state_province, country, website FROM books_publisher WHERE country = ‘U.S.A‘ ORDER BY name DESC;
5.限制返回的數據:使用標準的列表裁剪語句
另一個常用的需求就是取出固定數目的記錄。 想象一下你有成千上萬的出版商在你的數據庫裏, 但是你只想顯示第一個。 你可以使用標準的Python列表裁剪語句:
6
>>> Publisher.objects.order_by(‘name‘)[0] <Publisher: Apress>
這相當於:
SELECT id, name, address, city, state_province, country, website FROM books_publisher ORDER BY name LIMIT 1;
類似的,你可以用Python的range-slicing語法來取出數據的特定子集:
1
>>> Publisher.objects.order_by(‘name‘)[0:2]
這個例子返回兩個對象,等同於以下的SQL語句:
SELECT id, name, address, city, state_province, country, website FROM books_publisher ORDER BY name OFFSET 0 LIMIT 2;
註意,不支持Python的負索引(negative slicing):
>>> Publisher.objects.order_by(‘name‘)[-1] Traceback (most recent call last): ... AssertionError: Negative indexing is not supported.
雖然不支持負索引,但是我們可以使用其他的方法。 比如,稍微修改 order_by() 語句來實現:
>>> Publisher.objects.order_by(‘-name‘)[0]
6.更新多個對象 django的save()方法,不僅僅更新指定的哪一個列的值,而是更新了所有的列,如果我們只要更新一個列,就用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‘)update()方法會返回一個整型數值,表示受影響的記錄條數。 在上面的例子中,這個值是2。
7.刪除對象 刪除數據庫中的對象只需要調用該對象的 delete()方法
>>> p = Publisher.objects.get(name="O‘Reilly") >>> p.delete() >>> Publisher.objects.all() [<Publisher: Apress Publishing>]
同樣我們可以在結果集上調用delete()方法同時刪除多條記錄。這一點與我們上一小節提到的update()方法相似:
2
>>> Publisher.objects.filter(country=‘USA‘).delete() >>> Publisher.objects.all().delete() >>> Publisher.objects.all() []
刪除數據時要謹慎! 為了預防誤刪除掉某一個表內的所有數據,Django要求在刪除表內所有數據時顯示使用all()。 比如,下面的操作將會出錯:
1
>>> 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()
django 數據庫的一些操作