「原創」Django第六章、模型操作

2022年10月23日12:05:47 熱門 1748

20大進階架構專題每日送達

「原創」Django第六章、模型操作 - 天天要聞

模型的操作

回顧

上一章中我們建立了一個博客文章的模型,然後通過數據遷移建立我們對應中的資料庫表,這一章我們接著說模型的操作,這一章的小部分內容可能需要大家對資料庫操作有一點熟悉。相信大家都是抱著學習Django的目的來看這一套入門筆記,我就不敢再各位資料庫大佬們面前班門弄斧了,直接進入本章學習了。

SQLite的啟動

對資料庫的操作可以利用GUI工具,也可以通過命令行sqlite3 db.sqlite3,我們在db.sqlite3所在的目錄下使用上述命令,就可以進入到db.sqlite3資料庫,如果本地開發中沒有配置SQLite環境,可以自行搜索如何配置。

如果我們輸入命令,看到如下信息,說明進入成功:

 ~/DjangoProject/myblog $ sqlite3 db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite>

然後我們使用「.tables」即可查看當前資料庫中的資料庫表的名稱,除了blog_blogarticles是我們通過BlogArticles模型建立的,其餘的都是項目默認創建的資料庫表。

 ~/DjangoProject/myblog $ sqlite3 db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite> .tables
auth_group blog_blogarticles
auth_group_permissions django_admin_log
auth_permission django_content_type
auth_user django_migrations
auth_user_groups django_session
auth_user_user_permissions
sqlite>

接下來使用pragma table_info(blog_blogarticles);命令來查看blog_blogarticles表的結構:

sqlite> .header on
sqlite> pragma table_info(blog_blogarticles);
cid|name |type |not|dflt_value|pk
0| id |integer |1 | |1
1|title |varchar(300)|1 | |0
2|body |text |1 | |0
3|publish |datetime |1 | |0
4|author_id|integer |1 | |0
sqlite>

.header on 開啟頭部顯示 SQLite 的 PRAGMA 命令是一個特殊的命令,可以用在 SQLite 環境內控制各種環境變數和狀態標誌。一個 PRAGMA 值可以被讀取,也可以根據需求進行設置。

我們可以大致查看上面的表結構,cid是指列id,name是指列名,type是指列類型,not非空,值為1表示True,dflt_value是指default默認值(這一列沒有值,說明設置設置默認值),pk是指primary_key主鍵。

大家可以跟我們在前一章中的數據模型BlogArticles所規定的欄位和屬性進行對比,是不是剛好我們利用數據遷移成功將數據模型轉化為資料庫表。

創建超級管理員

我們可以在命令行中輸入python manage.py createsuperuser創建一個Django超級管理員,輸入用戶名和密碼,當提示Superuser created successfully,創建成功。如下:

 ~/DjangoProject/myblog $ python manage.py createsuperuser
Username (leave blank to use 'yuzhou_1su'): zoeu
Email address: test@test.com
Password:
Password (again):
Superuser created successfully.

然後我在瀏覽器輸入http://127.0.0.1:8000/admin/ ,就可以打開如下界面:

「原創」Django第六章、模型操作 - 天天要聞

輸入剛才創建的超級管理員的用戶名和密碼就可以進入系統,如圖:

「原創」Django第六章、模型操作 - 天天要聞

Groups和Users是Django在用戶管理應用中默認的用戶分類。為了讓我們得管理員用戶能夠發布博客,我們需要在./blog/admin.py 文件中,加入如下代碼:

from django.contrib import admin
# 新增,將BlogArticles類引入到當前環境中
from .models import BlogArticles

# 將BlogArticles註冊到admin中
admin.site.register(BlogArticles)

刷新頁面,我們可以得到如下的頁面:

「原創」Django第六章、模型操作 - 天天要聞

超級管理員界面先放在這,我們回到模型操作。

試驗模型API

使用Python進行開發的一個重要優點是互動式shell。我們在./blog/models.py中創建了數據模型後,Django就會自動提供資料庫抽象的API,這是一種快速嘗試和試驗API的方法。通過這個API我們可以快速創建、獲取、修改和刪除對象,對此我們稱之為ORM(Object-Relational Mapper)

我們可以使用manage.py工具載入我們的項目來啟動 Python shell :

python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

請特別注意我們進入shell的方式,不是直接在命令行中敲python3,雖然這與直接輸入python指令來調用互動式控制台是非常相似。

區別是我們利用manage.py工具,將項目將被添加到sys.path並載入Django。這意味著我們可以在項目中導入我們的模型和其他資源並使用它。

讓我們從導入BlogArticles類開始:下面就可以開始我們對資料庫的增、刪、改、查等操作。

$ python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.auth.models import User
>>> from blog.models import BlogArticles
>>> admin = User.objects.get(username="zoeu")
>>> admin.username
'zoeu'
>>> admin.id
1
>>> admin.password
'pbkdf2_sha256$150000$b9j0ZKBVZSo1$l+fEIiKIaS6u1mhjMPOX1qR0xMOaemnRJIwiE2lNn60='
>>> admin.email
'test@test.com'
>>> type(admin)
<class 'django.contrib.auth.models.User'>

以上對用戶的查詢操作是不是剛好是我們上一節中在創建管理員的中你自己定義的內容。

接下來,我們對博客文章進行操作,要創建新的 BlogArticle 對象,我們可以執行以下操作:

>>> BlogAriticle01 = BlogArticles(title ='DjangoNotes_Day01', author=admin, body='Django是啥?');

為了將這個對象保存在資料庫中,我們必須調用save方法:

>>> BlogAriticle01.save

save方法用於創建和更新對象。這裡Django創建了一個新對象,因為這時BlogAriticle01 實例沒有id。第一次保存後,Django會自動設置ID:

>>> BlogAriticle01.id
4

因為我自己在之前創建過其它文章,所以這個id 值為4,如果你是按照本入門筆記一步步操作過來,id 值應該為1。當然,還可以查看其它屬性,這裡統一將命令敲出來:

>>> BlogAriticle01.title
'DjangoNotes_Day01'
>>> BlogAriticle01.author
<User: admin>
>>> BlogAriticle01.body
'Django是啥?'
>>> BlogAriticle01.publish
datetime.datetime(2019, 9, 30, 19, 56, 58, 735676)
>>>

每個Django模型都帶有一個特殊的屬性; 我們稱之為模型管理器(Model Manager)。你可以通過屬性objects 來訪問這個管理器,它主要用於資料庫操作。例如,我們可以使用它來直接創建一個新的Board對象:

>>> BlogArticle02 = BlogArticles.objects.create(title='Python', author=admin, body='Head First to Python.')
>>> BlogArticle02.id
5

要更新一個值,我們可以進行如下操作:

>>> BlogAriticle01.body = 'I love Django, 但是我太難了'
>>> BlogAriticle01.body
'I love Django, 但是我太難了'

同樣為了將這個更改後的對象保存在資料庫中,我們必須調用save方法:

>>> BlogAriticle01.save
>>> blogs = BlogArticles.objects.all
>>> blogs
<QuerySet [<BlogArticles: Python>, <BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>

結果是一個QuerySet,我們可以將這個QuerySet看作一個列表。假設我們想遍歷它並列印每個模塊的標題。

>>> for blog in blogs:
... print(blog.title)
...
Python
DjangoNotes_Day01
right here waiting
Yesterday once more
You Raise me up
>>>

同樣,我們可以使用模型的 管理器(Manager) 來查詢資料庫並返回單個對象。為此,我們要使用 get 方法:

>>> BlogArticles.objects.get(id=5)
<BlogArticles: Python>
>>> BlogArticles.objects.get(id=5).delete
(1, {'blog.BlogArticles': 1})

刪除後再重新查看一下QuerySet,發現沒有了<BlogArticles: Python>,說明刪除成功。

>>> blogs = BlogArticles.objects.all
>>> blogs
<QuerySet [<BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>

除了get方法,其實也可以用filter進行篩選查詢id=5然後刪除,BlogArticles.objects.filter(id=5).delete,關於filter方法我們將在後面的文章中進行介紹。

總結

本章中首先學習了關於SQLite資料庫一些簡單的操作,然後我們創建Django自帶的超級用戶模塊(也就是管理員),並進行了登錄,基於這兩個內容的學習,我們開始在控制台中試驗我們創建博客文章模型的API。

下面是我們在本節中關於模型學到的方法和操作,使用BlogArticles模型作為參考。的BlogArticles指的是類,BlogArticles01指BlogArticles的一個實例(或對象)

操作代碼示例
創建一個對象而不保存BlogAriticle01 = BlogArticles
保存一個對象(創建或更新)BlogAriticle01.save
資料庫中創建並保存一個對象BlogArticle02 = BlogArticles.objects.create(title='...', author=..., body='...')
列出所有對象BlogArticles.objects.all
通過欄位標識獲取單個對象BlogArticles.objects.get(id=5)
通過欄位標識刪除單個對象BlogArticles.objects.get(id=5).delete

怎麼樣,學到這裡的讀者是不是很激動啊。我發現我在寫這些文字的時候也是重複練手的好機會,加深我對模型操作的印象,也希望大家通過多做練習明白這些操作。

下一章就是我們要開始學習視圖(views)的部分了,我們將通過管理員界面創建博客文章,然後在HTML中顯示我們的博客名。下一章再見!

———— e n d ————

微服務、高並發、JVM調優、面試專欄等20大進階架構師專題請關注公眾號【Java進階架構師】後在菜單欄查看。

熱門分類資訊推薦

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO - 天天要聞

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO

曾小賢的上司Lisa榕,現實中不僅才貌雙全,還嫁給了CEO雖然說《愛情公寓》這部劇在劇情上充滿了爭議,但是一定程度上,這部劇也是很多人的回憶,是伴隨了一代人的青春回憶,而且劇中的很多角色都成為了經典,他們的口頭禪也一直被拿來玩兒梗。
Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了 - 天天要聞

Lisa榕做主持多年沒紅,被陳赫拉進愛情公寓爆紅,如今怎樣了

談到《愛情公寓》這部火爆一時的歡樂喜劇,大家肯定都不陌生。不知道大家是否還記得《愛情公寓》中那個把曾小賢治得服服帖帖的女上司Lisa榕,現實中的她名叫榕榕,和劇中的形象也判若兩人。1981年出生在遼寧瀋陽的榕榕,畢業於上海戲劇學院,後來成為了上海東方傳媒集團有限公司的一名主持人。