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輸入
- 相關(guān)類型
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 ———— 反向引用的名稱