云南網(wǎng)站優(yōu)化建站seo優(yōu)化點(diǎn)擊軟件
文章目錄
- 1、Django 模型簡(jiǎn)介
- 2、Django 中創(chuàng)建并使用模型
- (1)新加一個(gè)名為 myapp 的應(yīng)用
- (2)定義模型類
- (2)激活模型類
- (3)創(chuàng)建數(shù)據(jù)庫遷移文件
- (4)應(yīng)用遷移文件
- 3、驗(yàn)證數(shù)據(jù)庫是否生成了`myapp_personinfo`表
- 4、疑問一:為什么創(chuàng)建出來的表是`myapp_personinfo`而不是`PersonInfo`或其他情況呢?
- 5、疑問二、為什么查詢出來的表結(jié)構(gòu)多出了一個(gè)`id`列呢?
1、Django 模型簡(jiǎn)介
在Django框架中,模型(Model)用于與數(shù)據(jù)庫進(jìn)行交互,實(shí)現(xiàn)ORM(對(duì)象關(guān)系映射)。
Django的ORM系統(tǒng)支持多種數(shù)據(jù)庫,包括PostgreSQL、SQLite、MySQL、MariaDB和Oracle,為不同數(shù)據(jù)庫提供了統(tǒng)一的API接口。模型**通常(有特例)**映射到數(shù)據(jù)庫中的一張表,模型字段對(duì)應(yīng)表的列,并在業(yè)務(wù)邏輯層與數(shù)據(jù)庫之間構(gòu)建橋梁。
Django將數(shù)據(jù)庫配置集中在settings.py
中,而models.py
文件則僅關(guān)注業(yè)務(wù)邏輯,使得模型代碼更加簡(jiǎn)潔且與數(shù)據(jù)庫類型解耦。Django模型的每個(gè)類繼承自django.db.models.Model
,其屬性對(duì)應(yīng)數(shù)據(jù)庫字段。
通過Django ORM,開發(fā)者可以將Python中的對(duì)象映射并持久化到數(shù)據(jù)庫中,從而方便地管理數(shù)據(jù)。
2、Django 中創(chuàng)建并使用模型
前言:這里我們使用django默認(rèn)支持的SQLite 數(shù)據(jù)庫,無需配置setting.py 即可直接使用。
(1)新加一個(gè)名為 myapp 的應(yīng)用
-
在命令行運(yùn)行如下命令
python manage.py startapp myapp
-
django 默認(rèn)已經(jīng)在myapp目錄下給你創(chuàng)建了
models.py
文件,如圖:
(2)定義模型類
-
操作:在應(yīng)用的
models.py
文件中定義模型類(如PersonInfo
),并繼承models.Model
-
示例:
from django.db import modelsclass PersonInfo(models.Model):name = models.CharField(max_length=50)gender = models.CharField(max_length=10)age = models.IntegerField()
-
說明:
PersonInfo
模型類包含name
(姓名)、gender
(性別)和age
(年齡)三個(gè)字段,分別使用CharField
和IntegerField
定義。
(2)激活模型類
-
在項(xiàng)目的
settings.py
文件中,找到INSTALLED_APPS
配置項(xiàng),添加模型所在的應(yīng)用(myapp
),以激活myapp/models.py
文件內(nèi)的模型類 -
示例:
INSTALLED_APPS = [...,'myapp', ]
(3)創(chuàng)建數(shù)據(jù)庫遷移文件
-
在命令行中運(yùn)行以下命令來生成遷移文件
python manage.py makemigrations
-
說明:此步驟會(huì)生成用于創(chuàng)建數(shù)據(jù)庫表的遷移文件,放置在
應(yīng)用名/migrations目錄下
,這里是myapp/migrations
:如圖:
(4)應(yīng)用遷移文件
-
在命令行中運(yùn)行如下命令,將遷移文件應(yīng)用到數(shù)據(jù)庫,將創(chuàng)建/更新數(shù)據(jù)庫中的表
python manage.py migrate
-
說明:這一步會(huì)在數(shù)據(jù)庫中生成
myapp_personinfo
表。
這四個(gè)步驟完成后,Django模型已成功定義并在數(shù)據(jù)庫中生成相應(yīng)的表,可以通過Django ORM進(jìn)行數(shù)據(jù)操作。
3、驗(yàn)證數(shù)據(jù)庫是否生成了myapp_personinfo
表
前言:
python manage.py migrate
該命令執(zhí)行后,項(xiàng)目根路徑下的db.sqlite3文件將更新;
-
命令行輸入以下命令進(jìn)入 SQLite 控制臺(tái):
sqlite3 db.sqlite3
-
使用下列 任意命令之一查詢當(dāng)前數(shù)據(jù)庫的所有表信息:
-- 方式一 .tables -- 方式二 SELECT name FROM sqlite_master WHERE type='table';
結(jié)果如圖:
-
驗(yàn)證新建表
myapp_personinfo
的表結(jié)構(gòu),運(yùn)行下列sql語句PRAGMA table_info(myapp_personinfo);
結(jié)果如圖:
4、疑問一:為什么創(chuàng)建出來的表是myapp_personinfo
而不是PersonInfo
或其他情況呢?
在 Django 中,表的名稱通常是根據(jù)應(yīng)用名稱和模型名稱自動(dòng)生成的,以確保命名唯一性,避免不同應(yīng)用中的模型名稱沖突。
(1)命名規(guī)則
Django 默認(rèn)使用以下規(guī)則創(chuàng)建表名:
<應(yīng)用名稱>_<模型名稱小寫>
因此,如果模型 PersonInfo
定義在應(yīng)用 myapp
中,那么 Django 會(huì)將表名生成為 myapp_personinfo
。這種命名方式有助于組織數(shù)據(jù)庫表,避免命名沖突。
(2)自定義表名
如果不想使用默認(rèn)的命名規(guī)則,可以在模型的 Meta
類中指定 db_table
屬性來自定義表名:
from django.db import modelsclass PersonInfo(models.Model):name = models.CharField(max_length=50)gender = models.CharField(max_length=10)age = models.IntegerField()class Meta:db_table = 'person_info' # 自定義表名
這樣,Django 會(huì)在數(shù)據(jù)庫中創(chuàng)建 person_info
表,而不是默認(rèn)的 myapp_personinfo
。
后續(xù)會(huì)講到**Meta
**相關(guān)內(nèi)容,敬請(qǐng)期待。。
5、疑問二、為什么查詢出來的表結(jié)構(gòu)多出了一個(gè)id
列呢?
如果沒有手動(dòng)定義主鍵,Django 會(huì)自動(dòng)在模型中添加一個(gè) id
字段,它是一個(gè)自增的整數(shù)列,用于唯一標(biāo)識(shí)每一行記錄,以方便Django進(jìn)行數(shù)據(jù)庫操作。
當(dāng)然通過自定義主鍵字段,可以去掉這個(gè)自動(dòng)生成的 id
列,但一般建議使用Django生成的默認(rèn)主鍵!!
-
自定義主鍵字段:如果不想使用自動(dòng)生成的
id
,可以在模型中定義自己的主鍵字段。比如:from django.db import modelsclass PersonInfo(models.Model):person_id = models.CharField(max_length=10, primary_key=True) # 自定義主鍵name = models.CharField(max_length=50)gender = models.CharField(max_length=10)age = models.IntegerField()
這樣定義后,
id
列將不會(huì)再自動(dòng)添加,person_id
將作為主鍵使用。