django models解析
阿新 • • 發佈:2018-11-15
2.ORM
物件關係對映(Oject Relational Mapping,簡稱ORM)模式是一種為了解決面向物件與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述物件和資料庫之間對映的元資料,自動生成sql語句,將程式中的物件自動儲存到關係資料庫中。優點:
- 隱藏了資料庫訪問的細節,簡化了sql的使用,提高了開發效率
- 解耦業務邏輯層(view)和資料處理層(model),簡化了開發流程,提高了系統的可移植性
- 提高了安全性
缺點:
- 執行效率低
- 對複雜sql無能為力
- 增加了學習成本
2.1 基本概念
面向物件概念 | 面向關係概念 |
---|---|
類 | 表 |
物件 | 記錄(一行) |
屬性 | 欄位(屬性、列) |
- 一個模型類對應一個表
- 每個模型類都必須繼承django.db.models.Model
2.2 模型屬性
模型中的屬性和資料庫表的欄位對應,必須定義。模型的屬性需要定義成類屬性
#屬性定義語法為:
屬性 = models.欄位型別(選項)
- 屬性命名規則:
- 不能是python的保留關鍵字
- 不允許使用連續的下劃線,因為連續下劃線在查詢中會用到
- 定義屬性時需要指定欄位型別
- 主鍵一般不用自己定義,django會自動建立自增長主鍵列,如果你自己定義了主鍵,則django不會再自動生成主鍵
2.2.1欄位型別
欄位名稱 | 欄位說明 | 引數 |
---|---|---|
AutoField | 一個根據實際Id自動增長的 IntegerField(通常不指定 自動生成) | |
CharField | 字串,預設的表單樣式是 TextInput | max_length=字元長度 |
TextField | 大文字欄位,一般超過4000使用,預設的表單控制元件是Textarea | |
IntegerField | 整數 | |
DecimalField | 使用python的Decimal例項表示的十進位制浮點數 | max_digits總位數;decimal_places小數位數 |
FloatField | 用Python的float例項來表示的浮點數 | |
BooleanField | true/false 欄位,此欄位的預設表單控制是CheckboxInput | |
NullBooleanField | 支援null、true、false三種值 | |
DateField | 使用Python的datetime.date例項表示的日期,該欄位預設對應的表單控制元件是一個TextInput | auto_now和auto_now_add、default這三個引數不能同時共存 |
TimeField | 使用Python的datetime.time例項表示的時間 | 引數同DateField |
DateTimeField | 使用Python的datetime.datetime例項表示的日期和時間 | 引數同DateField |
ImageField | 繼承了FileField的所有屬性和方法,但對上傳的物件進行校驗,確保它是個有效的image |
- auto_now: 每次儲存物件時,自動設定該欄位為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,預設為false
- auto_now_add: 當物件第一次被建立時自動設定當前時間,用於建立的時間戳,它總是使用當前日期,預設為false
2.2.2 欄位選項
適用於任何欄位,可以實現欄位的約束,在生成欄位時通過方法的關鍵字引數指定。
可選引數 | 說明 |
---|---|
null | 如果True ,Django將NULL 在資料庫中儲存空值。預設是False 。不要在字串欄位上使用。null是資料庫範疇的概念 |
blank | 如果True ,該欄位允許為空。預設是False 。同null不同, 如果欄位有blank=True ,則表單驗證將允許輸入空值。如果欄位有blank=False ,則需要該欄位。 |
db_column | 用於此欄位的資料庫列的名稱。如果沒有給出,Django將使用該欄位的名稱。 |
db_index | 如果True ,將為此欄位建立資料庫常規索引。 |
unique | 如果True ,該欄位在整個表格中必須是唯一的。 |
primary_key | 如果True ,此欄位是模型的主鍵。 |
default | 預設值 當前欄位如果不給值則執行預設值 |
3.定義模型
我們可以在應用的models.py中定義模型:
from django.db import models
class 模型名(models.Model):
屬性名 = models.欄位名(欄位選項/引數)
.....
class Meta: #可選,任何非欄位的設定可以寫到Meta中
db_table = 'user' #指定表名為uesr
-
資料庫的表名等於:應用名_模型名,如果想指定表名,可以在Meta中使用db_table指定
-
如果沒有指定主鍵,Django將自動給表建立一個自增長主鍵id
id = models.AutoField(primary_key=True)
下面我們定義幾個模型類
from django.db import models
from django.utils import timezone
#使用者類
class User(models.Model):
uid = models.AutoField(primary_key=True) #自增主鍵
uname = models.CharField(max_length=60)
password = models.CharField(max_length=32)
user_type = ((1,'超級管理員'),(2,'普通使用者')) #使用者自定義型別對應mysql的enum型別
type = models.IntegerField(default=2,choices=user_type)
regtime = models.DateTimeField(default=timezone.now) #預設值是當前時間
ip = models.IntegerField(null=True)
login_type = ((1,'允許登入'),(2,'禁止登入')) #使用者自定義型別對應mysql的enum型別
allowed = models.IntegerField(default=1,choices=login_type)
email = models.CharField(max_length=100,null=True)
memo = models.CharField(max_length=1000,null=True)
class Meta:
db_table = 'user' #表名
4.啟用模型
-
建立遷移檔案 (此刻表並沒有建立到庫中)
$ python3 manage.py makemigrations
-
執行遷移 (將模型建立到庫中)
$ python3 manage.py migrate
然後在應用的migrations目錄中應該生成了遷移檔案
├── app
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── __init__.py
生成的表結構如下:
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`uname` varchar(60) NOT NULL,
`password` char(32) NOT NULL,
`type` enum('超級管理員','普通使用者') DEFAULT '普通使用者',
`regtime` datetime DEFAULT NULL,
`ip` int(11) DEFAULT NULL,
`allowed` enum('允許登入','禁止登入') DEFAULT '允許登入',
`email` varchar(100) DEFAULT NULL,
`memo` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`uid`)
)
注意:
- 任何對欄位或表的修改都需要重新遷移