在上一章,我們學(xué)到如何使用 Django Model 抽象地表達(dá)資料庫(kù)結(jié)構(gòu)。 在完成 Model 的定義后,我們即可使用 Django 提供的豐富 API ,來與資料庫(kù)互動(dòng)。
本章你會(huì)學(xué)到:如何使用 Django API 來與資料庫(kù)互動(dòng) (CRUD)。
CRUD 指的是,Create (新增)、Read (讀取)、Update (修改)、Delete (刪除) 等常見的資料庫(kù)操作。
與先前不同的是,在這裡我們不使用 Python Shell。若要在 Python Shell 使用 Django 的功能或模組,還需另外載入設(shè)定。
所以我們這裡使用的是 Django Shell
Django Shell
與 Python Shell 類似的互動(dòng)式命令列。會(huì)預(yù)先載入 Django 的相關(guān)設(shè)定,所以可以在此執(zhí)行 Django 的 API。
使用 shell 指令,進(jìn)入 Django Shell:
python manage.py shell
這個(gè) shell 和我們之前輸入 python
執(zhí)行的 shell 長(zhǎng)得一樣,只是它會(huì)預(yù)先為我們?cè)O(shè)定 Django 需要的環(huán)境,方便我們執(zhí)行 Django 相關(guān)的程式。
首先,讓我們來試著新增幾筆資料:
>>> from trips.models import Post
>>> Post.objects.create(title='My First Trip', content='肚子好餓,吃什麼好呢?', location='臺(tái)北火車站')
<Post: Post object>
>>> Post.objects.create(title='My Second Trip', content='去散散步吧', location='臺(tái)北火車站')
<Post: Post object>
>>> Post.objects.create(title='Django 大冒險(xiǎn)', content='從靜態(tài)到動(dòng)態(tài)', location='臺(tái)北市大安區(qū)復(fù)興南路一段293號(hào)')
<Post: Post object>
若想顯示所有的 Post ,可以使用all():
>>> Post.objects.all()
[<Post: Post object>, <Post: Post object>, <Post: Post object>]
Django 通常以 <Post: Post object>
來表示 Post 物件,但此種顯示不易辨別。我們可以透過 def str 更改 Post 的表示方式,修改 trips/models.py:
# trips/models.py
from django.db import models
class Post(models.Model):
...
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
退出 Django Shell 后再重新進(jìn)入,Post 已經(jīng)被重新定義成顯示標(biāo)題,如 <Post: Your_Post_Title>
。
>>> Post.objects.all()
[<Post: My First Trip>, <Post: My Second Trip>, <Post: Django 大冒險(xiǎn)>]
而只想顯示部分資料時(shí),則可以使用 get
或 filter
:
>>> Post.objects.get(id=1)
<Post: My First Trip>
>>> Post.objects.filter(id__gt=1)
[<Post: My Second Trip>, <Post: Django 大冒險(xiǎn)>]
get:返回符合條件的唯一一筆資料。 ( 注意:如果找不到符合條件的資料、或是有多筆資料符合條件,都會(huì)產(chǎn)生 exception )
filter:返回符合條件的陣列。如果找不到任何資料則會(huì)返回空陣列。
當(dāng)想修改資料時(shí),可以使用 update 更新一筆或多筆資料:
首先,先取得欲更新的 Post。這裡使用 id < 3
的條件篩選
>>> posts = Post.objects.filter(id__lt=3)
共有 2個(gè) Post 符合 id < 3
的條件
>>> posts
[<Post: My First Trip>, <Post: My Second Trip>]
我們將 location 的值印出
>>> posts[0].location
'臺(tái)北火車站'
>>> posts[1].location
'臺(tái)北火車站'
>>>
印出后發(fā)現(xiàn), 兩個(gè) Post 的 location 都是臺(tái)北火車站?,F(xiàn)在我們?cè)囋囉?update
指令,把它改成 '捷運(yùn)大安站'
>>> posts.update(location='捷運(yùn)大安站')
2
回傳的數(shù)字 2
指的是已被更新的資料筆數(shù)。我們可以驗(yàn)證一下,location 是否皆已被正確更新
>>> posts[0].location
'捷運(yùn)大安站'
>>> posts[1].location
'捷運(yùn)大安站'
當(dāng)然,也可以使用 delete 刪除一筆或多筆資料:
我們?cè)囍褂?delete
,將剛剛的那兩筆 Post 刪除。
>>> posts.delete()
確認(rèn)一下,資料是否刪除
>>> Post.objects.all()
[<Post: Django 大冒險(xiǎn)>]
更多建議: