1. 程式人生 > >django models解析

django models解析

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`)
) 

注意:

  • 任何對欄位或表的修改都需要重新遷移