本文小編為大家詳細(xì)介紹“Python Django的模型建立與操作方法是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python Django的模型建立與操作方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
創(chuàng)新互聯(lián)公司是一家專業(yè)提供商州企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、H5技術(shù)、小程序制作等業(yè)務(wù)。10年已為商州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
我們要建立一個(gè)博客系統(tǒng),首先先在 manage.py 所在目錄下,用命令 python manage.py startapp blog
新建一個(gè) blog 應(yīng)用,然后在 ./blog/models.py
中寫一個(gè)類,命名為 BlogArticles
。
通過這個(gè)類我們可以創(chuàng)建一個(gè)專門用來保存博客文章的數(shù)據(jù)庫表,代碼如下:
from django.db import modelsfrom django.utils import timezone # 新增from django.contrib.auth.models import User # 新增# Create your models here.# 編寫博客的數(shù)據(jù)類型類BlogArticlesclass BlogArticles(models.Model): # 字段title的屬性為CharField()類型,并且以參數(shù)max_length=300說明字段的最大數(shù)量
title = models.CharField(max_length=300) # 一個(gè)用戶對應(yīng)多篇文章,級聯(lián)刪除
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
body = models.TextField()
publish = models.DateTimeField(default=timezone.now) class Meta:
ordering = ("-publish", ) # 規(guī)定了BlogArticles實(shí)例對象的顯示順序,即按照publish字段值的倒序顯示
def __str__(self): return self.title
timezone 模塊,我們未來記錄文章發(fā)布時(shí)間,所以導(dǎo)入了這個(gè)模塊。但因?yàn)?Django 默認(rèn)開啟時(shí)區(qū)且為 UTC,所以需要在 settings 中進(jìn)行如下設(shè)置:
TIME_ZONE = 'Asia/Shanghai' # 設(shè)置東八區(qū)時(shí)間# TIME_ZONE = 'UTC'USE_TZ = False
User
模型被命名為內(nèi)置應(yīng)用叫 auth,它以命名空間 django.contrib.auth
的形式出現(xiàn)在 INSTALL_APPS
配置中
ForeignKey()
反映出一個(gè)用戶可以發(fā)表多篇文章,其中參數(shù) on_delete=models.CASCADE
是數(shù)據(jù)庫中的“級聯(lián)刪除”,如果“用戶表”中的某個(gè)用戶被刪除,那么“文章表”中該用戶對應(yīng)的文章記錄也將被刪除。
另一個(gè)參數(shù) related_name="blog_posts"
的作用是允許 User 的實(shí)例(某個(gè)用戶名)以 “blog_posts” 屬性反向查詢到類 BlogArticles 的實(shí)例。
我們還定義了 Meta 子類,使用了 ordering = ("-publish", )
規(guī)定文章的顯示順序
__str__
方法是對象的字符串表示形式。我們可以使用版塊的名稱來表示它。
以上步驟我們還是僅僅在我們創(chuàng)建 blog 應(yīng)用中寫了一個(gè)博客文章模型,如果想要讓應(yīng)用生效,我們還需要將應(yīng)用配置到我們的 settings 當(dāng)中去,在 settings.py
文件的 INSTALLED_APPS
列表中添加 blog 應(yīng)用,如下所示:
BlogArticles
類的數(shù)據(jù)模型編寫完畢,我們得數(shù)據(jù)庫表就是通過這個(gè)類中各字段和屬性創(chuàng)建完成。
下一步就是告訴 Django,我的模型類創(chuàng)建好了,該到你創(chuàng)建數(shù)據(jù)庫了,我們打開終端,轉(zhuǎn)到 manage.py
文件所在的文件夾,然后運(yùn)行一下命令:
python manage.py makemigrations
然后你將看到如下輸出內(nèi)容:
Migrations for 'blog':
blog/migrations/0001_initial.py
- Create model BlogArticles
此時(shí),Django 在 /blog/migrations
目錄中創(chuàng)建了一個(gè)名為 0001_initial.py
的文件。它代表了應(yīng)用程序模型的當(dāng)前狀態(tài),在下一步,將使用該文件創(chuàng)建表和列。
遷移文件將被翻譯成 SQL 語句。執(zhí)行下面命令:
python manage.py sqlmigrate blog 0001
然后可以看到如下輸出內(nèi)容:
BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;
最后我們將生產(chǎn)的遷移文件應(yīng)用到數(shù)據(jù)庫中:
python manage.py migrate
當(dāng)看到
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
...
Applying sessions.001_initial... OK
Applying sessions.001_initial... OK
,這是我們在上一步生產(chǎn)的遷移腳本。意味著,我們的數(shù)據(jù)庫已經(jīng)可以開始使用了。
Django 自帶一個(gè)數(shù)據(jù)庫 SQLite,需要注意的是 SQLite 是一個(gè)產(chǎn)品級數(shù)據(jù)庫。SQLite 被許多公司用于成千上萬的產(chǎn)品,如所有 Android 和 iOS 設(shè)備,主流的 Web 瀏覽器,Windows 10,MacOS 等。 但這不適合所有情況。SQLite 不能與 MySQL,PostgreSQL 或 Oracle 等數(shù)據(jù)庫進(jìn)行比較。大容量的網(wǎng)站,密集型寫入的應(yīng)用程序,大的數(shù)據(jù)集,高并發(fā)性的應(yīng)用使用 SQLite 最終都會(huì)導(dǎo)致問題。
SQLite 很輕量級,但是并不影響我們用來學(xué)習(xí),接下來我們將利用命令行工具來對模型進(jìn)行操作,也就是我們學(xué)習(xí)過數(shù)據(jù)庫的基本操作——增、刪、改、查。
上面的內(nèi)容中建立了一個(gè)博客文章的模型,然后通過數(shù)據(jù)遷移建立我們對應(yīng)中的數(shù)據(jù)庫表,加下來基于上述模型進(jìn)行一些增刪改成的操作,這小部分內(nèi)容可能需要大家對數(shù)據(jù)庫操作有一點(diǎn)熟悉。相信大家都是抱著學(xué)習(xí) Django 的目的來看這一套入門筆記,我就不敢再各位數(shù)據(jù)庫大佬們面前班門弄斧了,直接進(jìn)入本章學(xué)習(xí)了。
對數(shù)據(jù)庫的操作可以利用 GUI 工具,也可以通過命令行 sqlite3 db.sqlite3
,我們在 db.sqlite3 所在的目錄下使用上述命令,就可以進(jìn)入到 db.sqlite3 數(shù)據(jù)庫,如果本地開發(fā)中沒有配置 SQLite 環(huán)境,可以自行搜索如何配置。
如果我們輸入命令,看到如下信息,說明進(jìn)入成功:
~/DjangoProject/myblog $ sqlite3 db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite>
然后我們使用 .tables
即可查看當(dāng)前數(shù)據(jù)庫中的數(shù)據(jù)庫表的名稱,除了 blog_blogarticles
是我們通過 BlogArticles 模型建立的,其余的都是項(xiàng)目默認(rèn)創(chuàng)建的數(shù)據(jù)庫表。
~/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 表的結(jié)構(gòu):
sqlite> .header on
sqlite> pragma table_info(blog_blogarticles);
cid|name |type |notnull|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
命令是一個(gè)特殊的命令,可以用在 SQLite 環(huán)境內(nèi)控制各種環(huán)境變量和狀態(tài)標(biāo)志。一個(gè) PRAGMA 值可以被讀取,也可以根據(jù)需求進(jìn)行設(shè)置。
我們可以大致查看上面的表結(jié)構(gòu),cid 是指列 id,name 是指列名,type 是指列類型,notnull 非空,值為 1 表示 True,dflt_value 是指 default 默認(rèn)值(這一列沒有值,說明設(shè)置設(shè)置默認(rèn)值),pk 是指 primary_key 主鍵。
大家可以跟我們在前一章中的數(shù)據(jù)模型 BlogArticles 所規(guī)定的字段和屬性進(jìn)行對比,是不是剛好我們利用數(shù)據(jù)遷移成功將數(shù)據(jù)模型轉(zhuǎn)化為數(shù)據(jù)庫表。
我們可以在命令行中輸入 python manage.py createsuperuser
創(chuàng)建一個(gè) Django 超級管理員,輸入用戶名和密碼,當(dāng)提示 Superuser created successfully,創(chuàng)建成功。如下:
~/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/
,就可以打開如下界面:
輸入剛才創(chuàng)建的超級管理員的用戶名和密碼就可以進(jìn)入系統(tǒng),如圖:
Groups 和 Users 是 Django 在用戶管理應(yīng)用中默認(rèn)的用戶分類。為了讓我們得管理員用戶能夠發(fā)布博客,我們需要在 ./blog/admin.py
文件中,加入如下代碼:
from django.contrib import admin# 新增,將BlogArticles類引入到當(dāng)前環(huán)境中from .models import BlogArticles
# 將BlogArticles注冊到admin中admin.site.register(BlogArticles)
刷新頁面,我們可以得到如下的頁面:
超級管理員界面先放在這,我們回到模型操作。
使用 Python 進(jìn)行開發(fā)的一個(gè)重要優(yōu)點(diǎn)是交互式 shell。我們在 ./blog/models.py
中創(chuàng)建了數(shù)據(jù)模型后,Django 就會(huì)自動(dòng)提供數(shù)據(jù)庫抽象的 API,這是一種快速嘗試和試驗(yàn) API 的方法。通過這個(gè) API 我們可以快速創(chuàng)建、獲取、修改和刪除對象,對此我們稱之為 ORM(Object-Relational Mapper)
我們可以使用 manage.py
工具加載我們的項(xiàng)目來啟動(dòng) Python shell :
python3 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)
>>>
請?zhí)貏e注意我們進(jìn)入 shell 的方式,不是直接在命令行中敲 python3,雖然這與直接輸入 python 指令來調(diào)用交互式控制臺是非常相似。
區(qū)別是我們利用 manage.py 工具,將項(xiàng)目將被添加到 sys.path
并加載 Django。這意味著我們可以在項(xiàng)目中導(dǎo)入我們的模型和其他資源并使用它。
讓我們從導(dǎo)入 BlogArticles 類開始:下面就可以開始我們對數(shù)據(jù)庫的增、刪、改、查等操作。
$ python3 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 darwinType "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="zoue")>>> admin.username'zoeu'>>> admin.id1>>> admin.password'pbkdf2_sha256$150000$b9j0ZKBVZSo1$l+fEIiKIaS6u1mhjMPOX1qR0xMOaemnRJIwiE2lNn60='>>> admin.email'test@test.com'>>> type(admin)
<class 'django.contrib.auth.models.User'>
接下來,要?jiǎng)?chuàng)建新的 BlogArticle 對象,我們可以執(zhí)行以下操作:
增
>>> BlogAriticle01 = BlogArticles(title ='DjangoNotes_Day01', author=zoue, body='Django是啥?');
為了將這個(gè)對象保存在數(shù)據(jù)庫中,我們必須調(diào)用 save 方法:
>>> BlogAriticle01.save()
save
方法用于創(chuàng)建和更新對象。這里Django創(chuàng)建了一個(gè)新對象,因?yàn)檫@時(shí) BlogAriticle01 實(shí)例沒有 id。第一次保存后,Django 會(huì)自動(dòng)設(shè)置 ID :
>>> BlogAriticle01.id4
因?yàn)槲易约涸谥皠?chuàng)建過其它文章,所以這個(gè) id 值為 4,如果你是按照本入門筆記一步步操作過來,id 值應(yīng)該為 1。
當(dāng)然,還可以查看其它屬性,這里統(tǒng)一將命令敲出來:
>>> BlogAriticle01.title'DjangoNotes_Day01'>>> BlogAriticle01.author
<User: admin>>>> BlogAriticle01.body'Django是啥?'>>> BlogAriticle01.publish
datetime.datetime(2019, 9, 30, 19, 56, 58, 735676)>>>
每個(gè) Django 模型都帶有一個(gè)特殊的屬性; 我們稱之為模型管理器(Model Manager)。你可以通過屬性 objects 來訪問這個(gè)管理器,它主要用于數(shù)據(jù)庫操作。例如,我們可以使用它來直接創(chuàng)建一個(gè)新的 Board 對象:
>>> BlogArticle02 = BlogArticles.objects.create(title='Python', author=admin, body='Head First to Python.')>>> BlogArticle02.id5
改
要更新一個(gè)值,我們可以利用如下操作:
>>> BlogAriticle01.body = 'I love Django, 但是我太難了'>>> BlogAriticle01.body'I love Django, 但是我太難了'
查
>>> blogs = BlogArticles.objects.all()>>> blogs
<QuerySet [<BlogArticles: Python>, <BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>
結(jié)果是一個(gè) QuerySet,我們可以將這個(gè) QuerySet 看作一個(gè)列表。假設(shè)我們想遍歷它并打印每個(gè)模塊的標(biāo)題。
>>> for blog in blogs:... print(blog.title)... Python
DjangoNotes_Day01
right here waiting
Yesterday once more
You Raise me up>>>
同樣,我們可以使用模型的 管理器(Manager) 來查詢數(shù)據(jù)庫并返回單個(gè)對象。為此,我們要使用 get 方法:
>>> BlogArticles.objects.get(id=5)
<BlogArticles: Python>
刪
>>> BlogArticles.objects.get(id=5).delete()
(1, {'blog.BlogArticles': 1})
刪除后再重新查看一下 QuerySet,發(fā)現(xiàn)沒有了<BlogArticles: Python>,說明刪除成功。
除了 get 方法,其實(shí)也可以用 filter 進(jìn)行篩選查詢 id=5 然后刪除,>>> blogs = BlogArticles.objects.all()>>> blogs
<QuerySet [<BlogArticles: DjangoNotes_Day01>, <BlogArticles: right here waiting>, <BlogArticles: Yesterday once more>, <BlogArticles: You Raise me up>]>
BlogArticles.objects.filter(id=5).delete()。
讀到這里,這篇“Python Django的模型建立與操作方法是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁題目:PythonDjango的模型建立與操作方法是什么
鏈接地址:http://www.rwnh.cn/article46/gpoghg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、云服務(wù)器、面包屑導(dǎo)航、網(wǎng)站策劃、App開發(fā)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)