程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Django模型(一)

編輯:Python

目錄

一、簡介

二、ORM框架

1.ORM的介紹

2.ORM 的優點

3.ORM 的缺點

4.ORM 解析過程

三、使用Django進行數據庫開發的步驟

1.定義模型類

1) 數據庫表名

2) 關於主鍵

3)屬性命名限制

4)字段類型

5) 選項

6) 外鍵

7)示例

2.配置

3.模型遷移


一、簡介

模型是有關數據的唯一確定的信息源。它包含要存儲數據的基本字段和行為。通常,每個模型都映射到單個數據庫表。

  • 每一個模型是django.db.models.Model的子類
  • 每一個模型屬性代表數據表的一個字段。
  • Django提供了自動生成的數據庫訪問API,使用模型操作數據庫很方便

Django 對各種數據庫提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

Django 為這些數據庫提供了統一的調用API。 我們可以根據自己業務需求選擇不同的數據庫。

使用Django進行數據庫開發的提示 :

  • MVT設計模式中的Model, 專門負責和數據庫交互.對應(models.py)
  • 由於Model中內嵌了ORM框架, 所以不需要直接面向數據庫編程.
  • 而是定義模型類, 通過模型類和對象完成數據庫表的增刪改查.
  • ORM框架就是把數據庫表的行與相應的對象建立關聯, 互相轉換.使得數據庫的操作面向對象.

二、ORM框架

1.ORM的介紹

Django 模型使用自帶的 ORM。

對象關系映射(Object Relational Mapping,簡稱 ORM )用於實現面向對象編程語言裡不同類型系統的數據之間的轉換。

在ORM框架中,它幫我們把類和數據表進行了一個映射,可以讓我們通過類和類對象就能操作它所對應的表格中的數據。ORM框架還有一個功能,它可以根據我們設計的類自動幫我們生成數據庫中的表格,省去了我們自己建表的過程。ORM 在業務邏輯層和數據庫層之間充當了橋梁的作用。

ORM 是通過使用描述對象和數據庫之間的映射的元數據,將程序中的對象自動持久化到數據庫中。

2.ORM 的優點

  • 提高開發效率。
  • 不同數據庫可以平滑切換。

3.ORM 的缺點

  • ORM 代碼轉換為 SQL 語句時,需要花費一定的時間,執行效率會有所降低。
  • 長期寫 ORM 代碼,會降低編寫 SQL 語句的能力。

4.ORM 解析過程

  • 1、ORM 會將 Python 代碼轉成為 SQL 語句。
  • 2、SQL 語句通過 pymysql 傳送到數據庫服務端。
  • 3、在數據庫中執行 SQL 語句並將結果返回。

三、使用Django進行數據庫開發的步驟

  1. 定義模型類
  2. 模型遷移
  3. 操作數據庫

1.定義模型類

  • 模型類被定義在"應用/models.py"文件中。
  • 模型類必須繼承自Model類,位於包django.db.models中。

Django根據屬性的類型確定以下信息:

  • 當前選擇的數據庫支持字段的類型
  • 渲染管理表單時使用的默認html控件
  • 在管理站點最低限度的驗證

1) 數據庫表名

模型類如果未指明表名,Django默認以小寫app應用名_小寫模型類名為數據庫表名。

可通過db_table指明數據庫表名。

2) 關於主鍵

django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列後django不會再創建自動增長的主鍵列。

默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。

pk是主鍵的別名,若主鍵名為id2,那麼pk是id2的別名。

3)屬性命名限制

  • 不能是python的保留關鍵字。
  • 不允許使用連續的下劃線,這是由django的查詢方式決定的,在第4節會詳細講解查詢。
  • 定義屬性時需要指定字段類型,通過字段類型的參數指定選項。

       具體語法如下:

屬性=models.字段類型(選項)

4)字段類型

類型說明AutoField自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性BooleanField布爾字段,值為True或FalseNullBooleanField支持Null、True、False三種值CharField字符串,參數max_length表示最大字符個數TextField大文本字段,一般超過4000個字符時使用IntegerField整數DecimalField十進制浮點數, 參數max_digits表示總位數, 參數decimal_places表示小數位數FloatField浮點數DateField日期, 參數auto_now表示每次保存對象時,自動設置該字段為當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,默認為False; 參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認為False; 參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤TimeField時間,參數同DateFieldDateTimeField日期時間,參數同DateFieldFileField上傳文件字段ImageField繼承於FileField,對上傳的內容進行校驗,確保是有效的圖片

5) 選項

選項說明null如果為True,表示允許為空,默認值是Falseblank如果為True,則該字段允許為空白,默認值是Falsedb_column字段的名稱,如果未指定,則使用屬性的名稱db_index若值為True, 則在表中會為此字段創建索引,默認值是Falsedefault默認primary_key若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用unique如果為True, 這個字段在表中必須有唯一值,默認值是False

null是數據庫范疇的概念,blank是表單驗證范疇的

6) 外鍵

在設置外鍵時,需要通過on_delete選項指明主表刪除數據時,對於外鍵引用表數據如何處理,在django.db.models中包含了可選常量:

  • CASCADE級聯,刪除主表數據時連通一起刪除外鍵表中數據

  • PROTECT保護,通過拋出ProtectedError異常,來阻止刪除主表中被外鍵應用的數據

  • SET_NULL設置為NULL,僅在該字段null=True允許為null時可用

  • SET_DEFAULT設置為默認值,僅在該字段設置了默認值時可用

  • SET()設置為特定值或者調用特定方法

  • DO_NOTHING不做任何操作,如果數據庫前置指明級聯性,此選項會拋出IntegrityError異常

7)示例

  • 當前項目的開發, 都是數據驅動的。
  • 以下為書籍信息管理的數據關系:書名和人物是 :一對多關系

  • 要先分析出項目中所需要的數據, 然後設計數據庫表.

書籍信息表

字段名字段類型字段說明idAutoField主鍵nameCharField書名idname1斗羅大陸2牧龍師

人物信息表

字段名字段類型字段說明idAutoField主鍵nameCharField人名genderBooleanField性別bookForeignKey外鍵idnamegenderbook1唐三False12小舞True13祝明朗False24黎雲姿True2

定義模型類

根據書籍表結構設計模型類:

  • 模型類:BookInfo
  • 書籍名稱字段:name

根據人物表結構設計模型類:

  • 模型類:PeopleInfo
  • 人物姓名字段:name
  • 人物性別字段:gender
  • 外鍵約束:book

根據數據庫表的設計

        在models.py中定義模型類,繼承自models.Model

from django.db import models
# Create your models here.
# 准備書籍列表信息的模型類
class BookInfo(models.Model):
# 創建字段,字段類型...
name = models.CharField(max_length=10, verbose_name='名稱')
class Meta:
db_table = 'bookinfo' # 指明數據庫表名
verbose_name = '圖書' # 在admin站點中顯示的名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.name
# 准備人物列表信息的模型類
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名稱')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
def __str__(self):
return self.name

2.配置

在settings.py中保存了數據庫的連接配置信息,Django默認初始配置使用sqlite數據庫。

使用MySQL數據庫首先需要安裝驅動程序

pip install PyMySQL

在Django的工程同名子目錄的__init__.py文件中添加如下語句

import pymysql
pymysql.install_as_MySQLdb()

作用是讓Django的ORM能以mysqldb的方式來調用PyMySQL。

先在MySQL中創建數據庫

create database book charset=utf8;

修改DATABASES配置信息

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '127.0.0.1', # 數據庫主機
'PORT': 3306, # 數據庫端口
'USER': 'samual', # 數據庫用戶名
'PASSWORD': 'mysql', # 數據庫用戶密碼
'NAME': 'bookmanger' # 數據庫名字
}
}

3.模型遷移

遷移由兩步完成 :

1.生成遷移文件:根據模型類生成創建表的語句

python manage.py makemigrations

2. 執行遷移:根據第一步生成的語句在數據庫中創建表

python manage.py migrate

在PyCharm中我們可以打開控制台下的【Terminal】來執行遷移命令:

執行遷移文件前: 

 

生成遷移文件後,【migrations】目錄下會生成【0001_initial.py】文件:

 執行遷移:

完成後,我們打開MySQL中在指定的數據庫就能看到執行遷移成功的表:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved