第3節(jié) Django ORM模型

ORM模型基礎(chǔ)

Django ORM支持的數(shù)據(jù)庫

  • MySQL
  • MariaDB
  • SQLite
  • Postgre SQL
  • DRACL∈

Django ORM配置

項(xiàng)目配置(settings.py)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabase_user',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
  • default一默認(rèn)的數(shù)據(jù)庫,可配置多個數(shù)據(jù),使用名稱來區(qū)分
  • ENGINE一數(shù)據(jù)庫引擎
    • django.db.backends.postgresql
    • django.db.backends.mysql
    • django.db.backends.sqlite3
    • django.db.backends.oracle
  • NAME—數(shù)據(jù)庫名稱
  • USER—數(shù)據(jù)庫登錄用戶名
  • PASSWORD-數(shù)據(jù)庫登錄密碼
  • HOST一數(shù)據(jù)庫訪問地址
  • PORT一數(shù)據(jù)庫訪問端口

sqlite3的配置選項(xiàng)

只需要指定數(shù)據(jù)庫引擎和數(shù)據(jù)庫文件名稱即可

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

mysql數(shù)據(jù)庫新建

  • 字符集:utf8mb4
  • 排序規(guī)則:utf8mb4_general_ci

安裝依賴(數(shù)據(jù)庫)

pip install mysqlclient


常見的ORM字段類型

字段 描述
char 固定長度字符
varchar 可變長度字符串
text 長文本
float / decimal 浮點(diǎn)數(shù)(小數(shù))
int / tinyint 整型
data / time / datetime 日期/時間

模型代碼示例

from django.db import models

class User(models.Model):
    """用戶模型"""
    name = models.CharField('姓名',max_length=64)
    age = models.PositiveIntegerField('年齡',default=0)

文本

  • CharField传透、TextField ———— 字符串(varchar)、文本(text)
  • FileField碌冶、ImageField ———— 文件、圖片
  • FilePathField ———— 文件路徑
  • EmailField ———— 郵件地址
  • URLField ———— URL地址

數(shù)字(整數(shù))

  • IntegerField ———— 整數(shù)
  • SmalllntegerField ———— 整數(shù)
  • BiglntegerField ———— 整數(shù)
  • BooleanField ———— 布爾值(1涝缝,0)
  • PositivelntegerField ———— 正整數(shù)

數(shù)字(小數(shù))

  • FloatField扑庞、DecimalField ———— 小數(shù)

日期與時間

  • DateField ———— 日期(2050年5月1日)
  • TimeField ———— 時間(早上8:00)
  • DateTimeField ———— 日期時間(2050年5月1日 早上8:00)

特殊類型

  • OneToOneField ———— 對一關(guān)聯(lián)
  • ForeignKey ———— 外鍵關(guān)聯(lián)
  • ManyToManyField ———— 多對多關(guān)聯(lián)
  • GenericForeignKey ———— 復(fù)合關(guān)聯(lián)

模型基類django.db.models.Field

類型之間的關(guān)系

img.png

類型的選項(xiàng)(可選參數(shù))

  • 每個類型都有可選參數(shù),部分類型有必傳參數(shù)
  • 參數(shù)傳遞是無序的(需要寫參數(shù)的名稱)
  • 般情況下拒逮,第一個參數(shù)不指定名稱
  • verbose name
    • 大多數(shù)模型類型的第一個參數(shù)
    • ForeignKey罐氨、ManyToManyField、OneToOneField
  • null滩援、blank ———— 是否為Nul岂昭、空值
  • db column ———— 數(shù)據(jù)庫表中對應(yīng)的字段名稱
  • default ———— 不填寫改字段值時的默認(rèn)值
  • primary_key、unique ———— 主鍵狠怨、唯一索引
  • help_text ———— 幫助文字
  • choices ———— 可供選擇的選項(xiàng)约啊,如:性別的選項(xiàng)(男,女)
from django.db import models

sex = models.CharField('性別',max_lenth=1,choices={
  ('1','男'),
  ('2','女'),
})
  • get_FOO_display() ———— 展示choices對應(yīng)的值

CharField

  • max_length ———— 最大長度
    • 相關(guān)類型
      • EmailField ———— 郵件輸入
      • URLField ———— URL輸入

DateTimeField

  • auto_now ———— 更新時間為記錄更改時的時間
  • auto_now_add ———— 記錄創(chuàng)建的時間

模型的創(chuàng)建

from django.db import models

# Create your models here.


class User(models.Model):
    """用戶模型"""
    name = models.CharField('姓名', max_length=64)
    sex = models.CharField('性別', max_length=1, choices=(
        ('1', '帥哥'),
        ('0', '美女'),
    ), default='1')
    age = models.PositiveIntegerField('年齡', default=0)
    # unique=True 用戶名唯一
    username = models.CharField('用戶名', max_length=64, unique=True)
    password = models.CharField('密碼', max_length=256)
    # null=True 可以空佣赖,blank=True 可以是空字符串
    remark = models.CharField('備注', max_length=64, null=True, blank=True)

    # 用戶創(chuàng)建時間
    created_at = models.DateTimeField('注冊時間', auto_now_add=True)
    # 用戶修改時間
    updated_at = models.DateTimeField('最后修改時間', auto_now=True)

模型同步migrate

  • 前提:確認(rèn)settings.py
    • 已將模型添加到INSTALLED_APPS

實(shí)現(xiàn)模型同步

  • 步驟一:檢查模型是否編寫正確
python manage.py check
  • 步驟二:使用makemigrations生成同步原語
python manage.py makemigrations
  • 步驟三:使用migrate執(zhí)行同步
python manage.py migrate

模型的元數(shù)據(jù)

元數(shù)據(jù)的描述

  • 使用Meta類來表示
  • 對模型的補(bǔ)充說明
# 示例
class Meta:
    verbose_name = '用戶基礎(chǔ)信息'
    verbose_name_plural = '用戶基礎(chǔ)信息'
    # 指定模型表的名稱
    db_table = 'oauth_user'

元數(shù)據(jù)的描述

  • db_table ———— 模型映射的數(shù)據(jù)庫表的名稱
  • ordering ———— 指定數(shù)據(jù)表的默認(rèn)排序規(guī)則
  • verbose_name ———— 供編程查看的字段名稱(便于閱讀)
  • abstract ———— 抽象類
    • 抽象類不會生成數(shù)據(jù)庫表
  • proxy ———— 代理模型(對父模型的功能進(jìn)行擴(kuò)充)

外鍵關(guān)聯(lián)類型

一對一關(guān)系

  • OneToOneField(to, on_delete, parent_link=False, **options)
  • 舉例:用戶信息進(jìn)行分表(用戶基礎(chǔ)信息和用戶詳細(xì)信息)

一對多關(guān)系

  • ForeignKey(to, on_delete, **options)
  • 舉例:用戶提問(一個用戶可以提很多問題)

多對多關(guān)系

  • ManyToManyField(to, **options)
  • 舉例:收藏問題()

類型的參數(shù)選項(xiàng)

  • to ———— 關(guān)聯(lián)的模型(必傳)
    • 模型類
    • 模型類(字符串)
    • self(關(guān)聯(lián)同一個類:自己)
  • on_delete ———— 刪除選項(xiàng)(必傳)
    • CASCADE:關(guān)聯(lián)刪除
    • PROTECT:受保護(hù)恰矩,不允許被刪除
    • SET_NULL:設(shè)置為None,需要添加選項(xiàng)null=True
    • SET_DEFAULT:設(shè)置為默認(rèn)值憎蛤,需要添加選項(xiàng)default
    • SET():傳參設(shè)置值
    • DO_NOTHING:什么也不做
  • related_name ———— 是否需要反向引用外傅,反向引用的名稱
  • related_query_name ———— 反向引用的名稱
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纪吮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萎胰,更是在濱河造成了極大的恐慌碾盟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件技竟,死亡現(xiàn)場離奇詭異冰肴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榔组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門熙尉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搓扯,你說我怎么就攤上這事检痰。” “怎么了锨推?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵铅歼,是天一觀的道長。 經(jīng)常有香客問我换可,道長谭贪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任锦担,我火速辦了婚禮,結(jié)果婚禮上慨削,老公的妹妹穿的比我還像新娘洞渔。我一直安慰自己,他們只是感情好缚态,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布磁椒。 她就那樣靜靜地躺著,像睡著了一般玫芦。 火紅的嫁衣襯著肌膚如雪浆熔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天桥帆,我揣著相機(jī)與錄音医增,去河邊找鬼。 笑死老虫,一個胖子當(dāng)著我的面吹牛叶骨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祈匙,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忽刽,長吁一口氣:“原來是場噩夢啊……” “哼天揖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起跪帝,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤今膊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伞剑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑唬,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年纸泄,在試婚紗的時候發(fā)現(xiàn)自己被綠了赖钞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡聘裁,死狀恐怖雪营,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衡便,我是刑警寧澤献起,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站镣陕,受9級特大地震影響谴餐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜呆抑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一岂嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹊碍,春花似錦厌殉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耀销,卻和暖如春楼眷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熊尉。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工罐柳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狰住。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓硝清,卻偏偏與公主長得像,于是被迫代替她去往敵國和親转晰。 傳聞我的和親對象是個殘疾皇子芦拿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容