今天我們來介紹如何進 console
的環境,來進行物件的語法查詢、CRUD
$ python manage.py shell
------
Python 3.11.4 (main, Jun 16 2023, 17:11:43) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
這個就相當於 ROR 的 rails c
不過差異最大的地方就在於,ROR 的 console 環境很好閱讀,Django 的環境超級難閱讀
進入 shell 後,我們照著以下指令輸入:
>>> from online.models import Employer, Store, Product
>>> Employer.objects.all()
------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>
可以發現我們像剛剛的畫面一樣,抓出目前所有的 Employer
資料
要怎麼查看所有的欄位呢?
>>> Employer._meta.fields
------
(<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: first_name>, <django.db.models.fields.CharField: last_name>, <django.db.models.fields.PositiveIntegerField: age>)
雖然有點不好觀看,但應該還是可以免強看得出來有這幾個欄位: id
、first_name
、last_name
、age
>>> e = Employer(first_name="小偷",last_name="那每", age=18)
>>> e.save()
>>> e.id
------
5
當你根據欄位,新增完一個新的老闆後,記得要用save儲存,要不然這個物件不會存入資料庫,存好後確認一下是否有產生 id,如果有的話就代表成功新增了。
Ps. 你們的數字不一樣會跟我一樣喔,因為數字是根據你老闆數量所產生的
>>> Employer.objects.all()
------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 小偷-那每>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>
這時候我們在用查詢語法,查所有的老闆有哪些,可以發現剛剛新增的 小偷-那每
在裡面
>>> e.first_name = "美女"
>>> e.save()
>>> e
------
<Employer: 美女-那每>
我們剛剛修改了 Employer
的值,這邊你有沒有發現一件事,就是印出來的值,是我們當初在 models.py
那邊設定的 __str__
,因此我們修改 first_name
後,最後印出來是 修改過的 first_name-last_name
如果今天我想要找到 ID 為 3 的 Employer 物件要怎麼輸入呢?
>>> Employer.objects.filter(id=3)
------
<QuerySet [<Employer: 黑腳-香桔士>]>
剛剛是指定 ID 為 3 的物件,我現在想要篩選出 Employer
物件的 first_name
包含 美
這個字的 Employer
:
>>> Employer.objects.filter(first_name__contains='美')
------
<QuerySet [<Employer: 美女-那每>]>
可以發現他是一個陣列,所以如果今天有兩個以上的 Employer
有 first_name
是 美
開頭,就可以抓到他們
這個應該很熟悉了,畢竟前面我們前面學了好幾次,不過我們這次用 console 來操作試試:
employer.store_set.all()
的方法,取到該老闆所開設的商店>>> e3 = Employer.objects.filter(id=3)
>>> e3[0].store_set.all()
------
<QuerySet [<Store: 海上餐廳>, <Store: ALL BLUE餐館>]>
我們現在來用剛剛新增的 Employer
,使用關聯語法來新增這個老闆的 Store
:
Store._meta.fields
e.store_set.all()
e.store_set.create()
new_store.save()
new_store.id
e.store_set.all()
>>> Store._meta.fields
------
(<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: title>, <django.db.models.fields.TextField: description>, <django.db.models.fields.related.ForeignKey: employer>)
============================
>>> e.store_set.all()
------
<QuerySet []>
============================
>>> new_store = e.store_set.create(title="橘子員", description="種一堆水果的地方")
>>> new_store.save()
>>> new_store.id
------
7
============================
e.store_set.all()
------
<QuerySet [<Store: 橘子員>]>
我們在這邊刪除剛剛新增的 Employer
物件:
>>> e.delete()
------
(1, {'online.Employer': 1})
接著再查看物件是否刪除:
>>> Employer.objects.all()
------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>
可以發現剛剛新增的物件已經消失
這樣子就學完基本在 console 操作的指令拉,不過說真的在這邊操作其實不是很方便,如果你之前是寫 ROR
的朋友應該很能理解,因為 Django 的 console 介面真的非常難以閱讀,因此明天我們來介紹 Django 提供的另外一個功能 Django admin
,讓我們可以直接在後台快速 CRUD
Ps. 剛剛在終端機寫的語法,都可以在 Django 檔案中使用喔~
今天學到哪些東西呢?
最後附上 Github: https://github.com/eagle0526/Django-store