1. 程式人生 > >django 數據庫的一些操作

django 數據庫的一些操作

使用 literal ring port tab exce 刪除對象 ordering unicode

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查詢就是 WHEREORDER 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 數據庫的一些操作