溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django中ORM介紹和字段及字段參數(shù)

發(fā)布時(shí)間:2020-06-24 08:47:06 來源:網(wǎng)絡(luò) 閱讀:516 作者:Python熱愛者 欄目:編程語言

Object Relational Mapping(ORM)

ORM介紹

ORM概念

對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。

簡(jiǎn)單的說,ORM是通過使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。

ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)層之間充當(dāng)了橋梁的作用。

ORM由來

讓我們從O/R開始。字母O起源于"對(duì)象"(Object),而R則來自于"關(guān)系"(Relational)。

幾乎所有的軟件開發(fā)過程中都會(huì)涉及到對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在用戶層面和業(yè)務(wù)邏輯層面,我們是面向?qū)ο蟮?。?dāng)對(duì)象的信息發(fā)生變化的時(shí)候,我們就需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。

按照之前的方式來進(jìn)行開發(fā)就會(huì)出現(xiàn)程序員會(huì)在自己的業(yè)務(wù)邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關(guān)數(shù)據(jù),而這些代碼通常都是重復(fù)的。

ORM的優(yōu)勢(shì)

ORM解決的主要問題是對(duì)象和關(guān)系的映射。它通常把一個(gè)類和一個(gè)表一一對(duì)應(yīng),類的每個(gè)實(shí)例對(duì)應(yīng)表中的一條記錄,類的每個(gè)屬性對(duì)應(yīng)表中的每個(gè)字段。?

ORM提供了對(duì)數(shù)據(jù)庫(kù)的映射,不用直接編寫SQL代碼,只需像操作對(duì)象一樣從數(shù)據(jù)庫(kù)操作數(shù)據(jù)。

讓軟件開發(fā)人員專注于業(yè)務(wù)邏輯的處理,提高了開發(fā)效率。

ORM的劣勢(shì)

ORM的缺點(diǎn)是會(huì)在一定程度上犧牲程序的執(zhí)行效率。

ORM用多了SQL語句就不會(huì)寫了,關(guān)系數(shù)據(jù)庫(kù)相關(guān)技能退化...

ORM總結(jié)

ORM只是一種工具,工具確實(shí)能解決一些重復(fù),簡(jiǎn)單的勞動(dòng)。這是不可否認(rèn)的。

但我們不能指望某個(gè)工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。

但是在整個(gè)軟件開發(fā)過程中需要特殊處理的情況應(yīng)該都是很少的,否則所謂的工具也就失去了它存在的意義。

Django中的ORM

Django項(xiàng)目使用MySQL數(shù)據(jù)庫(kù)

1. 在Django項(xiàng)目的settings.py文件中,配置數(shù)據(jù)庫(kù)連接信息:


Django中ORM介紹和字段及字段參數(shù)

2. 在Django項(xiàng)目的__init__.py文件中寫如下代碼,告訴Django使用pymysql模塊連接MySQL數(shù)據(jù)庫(kù):


Django中ORM介紹和字段及字段參數(shù)

Model

在Django中model是你數(shù)據(jù)的單一、明確的信息來源。它包含了你存儲(chǔ)的數(shù)據(jù)的重要字段和行為。通常,一個(gè)模型(model)映射到一個(gè)數(shù)據(jù)庫(kù)表,

基本情況:

每個(gè)模型都是一個(gè)Python類,它是django.db.models.Model的子類。

模型的每個(gè)屬性都代表一個(gè)數(shù)據(jù)庫(kù)字段。

綜上所述,Django為您提供了一個(gè)自動(dòng)生成的數(shù)據(jù)庫(kù)訪問API,詳詢官方文檔鏈接。

Django中ORM介紹和字段及字段參數(shù)


快速入門?

下面這個(gè)例子定義了一個(gè)Person模型,包含first_name?last_name


Django中ORM介紹和字段及字段參數(shù)

first_name?last_name是模型的字段。每個(gè)字段被指定為一個(gè)類屬性,每個(gè)屬性映射到一個(gè)數(shù)據(jù)庫(kù)列。

上面的Person模型將會(huì)像這樣創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表:


Django中ORM介紹和字段及字段參數(shù)

一些說明:

表myapp_person的名稱是自動(dòng)生成的,如果你要自定義表名,需要在model的Meta類中指定?db_table?參數(shù),強(qiáng)烈建議使用小寫表名,特別是使用MySQL作為后端數(shù)據(jù)庫(kù)時(shí)。

id字段是自動(dòng)添加的,如果你想要指定自定義主鍵,只需在其中一個(gè)字段中指定?primary_key=True?即可。如果Django發(fā)現(xiàn)你已經(jīng)明確地設(shè)置了Field.primary_key,它將不會(huì)添加自動(dòng)ID列。

本示例中的CREATE TABLE SQL使用PostgreSQL語法進(jìn)行格式化,但值得注意的是,Django會(huì)根據(jù)配置文件中指定的數(shù)據(jù)庫(kù)后端類型來生成相應(yīng)的SQL語句。

Django支持MySQL5.5及更高版本。

Django ORM 常用字段和參數(shù)

常用字段

AutoField

int自增列,必須填入?yún)?shù) primary_key=True。當(dāng)model中如果沒有自增列,則自動(dòng)會(huì)創(chuàng)建一個(gè)列名為id的列。

IntegerField

一個(gè)整數(shù)類型,范圍在 -2147483648 to 2147483647。

CharField

字符類型,必須提供max_length參數(shù), max_length表示字符長(zhǎng)度。

DateField

日期字段,日期格式? YYYY-MM-DD,相當(dāng)于Python中的datetime.date()實(shí)例。

DateTimeField

日期時(shí)間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當(dāng)于Python中的datetime.datetime()實(shí)例。

字段合集(爭(zhēng)取記憶)


Django中ORM介紹和字段及字段參數(shù)

自定義字段(了解為主)


Django中ORM介紹和字段及字段參數(shù)

自定義char類型字段


Django中ORM介紹和字段及字段參數(shù)

創(chuàng)建的表結(jié)構(gòu):

Django中ORM介紹和字段及字段參數(shù)

附ORM字段與數(shù)據(jù)庫(kù)實(shí)際字段的對(duì)應(yīng)關(guān)系


Django中ORM介紹和字段及字段參數(shù)

字段參數(shù)

null

用于表示某個(gè)字段可以為空。

unique

如果設(shè)置為unique=True 則該字段在此表中必須是唯一的 。

db_index

如果db_index=True 則代表著為此字段設(shè)置數(shù)據(jù)庫(kù)索引。

default

為該字段設(shè)置默認(rèn)值。

時(shí)間字段獨(dú)有

DatetimeField、DateField、TimeField這個(gè)三個(gè)時(shí)間字段,都可以設(shè)置如下屬性。

auto_now_add

配置auto_now_add=True,創(chuàng)建數(shù)據(jù)記錄的時(shí)候會(huì)把當(dāng)前時(shí)間添加到數(shù)據(jù)庫(kù)。

auto_now

配置上auto_now=True,每次更新數(shù)據(jù)記錄的時(shí)候會(huì)更新該字段。


關(guān)系字段

ForeignKey

外鍵類型在ORM中用來表示外鍵關(guān)聯(lián)關(guān)系,一般把ForeignKey字段設(shè)置在 '一對(duì)多'中'多'的一方。

ForeignKey可以和其他表做關(guān)聯(lián)關(guān)系同時(shí)也可以和自身做關(guān)聯(lián)關(guān)系。

字段參數(shù)

to

設(shè)置要關(guān)聯(lián)的表

to_field

設(shè)置要關(guān)聯(lián)的表的字段

related_name

反向操作時(shí),使用的字段名,用于代替原反向查詢時(shí)的'表名_set'。

例如:

.

Django中ORM介紹和字段及字段參數(shù)

當(dāng)我們要查詢某個(gè)班級(jí)關(guān)聯(lián)的所有學(xué)生(反向查詢)時(shí),我們會(huì)這么寫:

models.Classes.objects.first().student_set.all()

當(dāng)我們?cè)贔oreignKey字段中添加了參數(shù)?related_name?后,


Django中ORM介紹和字段及字段參數(shù)

當(dāng)我們要查詢某個(gè)班級(jí)關(guān)聯(lián)的所有學(xué)生(反向查詢)時(shí),我們會(huì)這么寫:

models.Classes.objects.first().students.all()

related_query_name

反向查詢操作時(shí),使用的連接前綴,用于替換表名。

on_delete

當(dāng)刪除關(guān)聯(lián)表中的數(shù)據(jù)時(shí),當(dāng)前表與其關(guān)聯(lián)的行的行為。

models.CASCADE

刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)也刪除

models.DO_NOTHING

刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤IntegrityError

models.PROTECT

刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯(cuò)誤ProtectedError

models.SET_NULL

刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空)

models.SET_DEFAULT

刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認(rèn)值(前提FK字段需要設(shè)置默認(rèn)值)

models.SET

刪除關(guān)聯(lián)數(shù)據(jù),

a. 與之關(guān)聯(lián)的值設(shè)置為指定值,設(shè)置:models.SET(值)

b. 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對(duì)象的返回值,設(shè)置:models.SET(可執(zhí)行對(duì)象)


Django中ORM介紹和字段及字段參數(shù)

db_constraint

是否在數(shù)據(jù)庫(kù)中創(chuàng)建外鍵約束,默認(rèn)為True。

OneToOneField

一對(duì)一字段。

通常一對(duì)一字段用來擴(kuò)展已有字段。

示例

一對(duì)一的關(guān)聯(lián)關(guān)系多用在當(dāng)一張表的不同字段查詢頻次差距過大的情況下,將本可以存儲(chǔ)在一張表的字段拆開放置在兩張表中,然后將兩張表建立一對(duì)一的關(guān)聯(lián)關(guān)系。


Django中ORM介紹和字段及字段參數(shù)

字段參數(shù)

to

設(shè)置要關(guān)聯(lián)的表。

to_field

設(shè)置要關(guān)聯(lián)的字段。

on_delete

同F(xiàn)oreignKey字段。

ManyToManyField

用于表示多對(duì)多的關(guān)聯(lián)關(guān)系。在數(shù)據(jù)庫(kù)中通過第三張表來建立關(guān)聯(lián)關(guān)系。

字段參數(shù)

to

設(shè)置要關(guān)聯(lián)的表

related_name

同F(xiàn)oreignKey字段。

related_query_name

同F(xiàn)oreignKey字段。

symmetrical

僅用于多對(duì)多自關(guān)聯(lián)時(shí),指定內(nèi)部是否創(chuàng)建反向操作的字段。默認(rèn)為True。

舉個(gè)例子:


Django中ORM介紹和字段及字段參數(shù)

此時(shí),person對(duì)象就沒有person_set屬性。


Django中ORM介紹和字段及字段參數(shù)

此時(shí),person對(duì)象現(xiàn)在就可以使用person_set屬性進(jìn)行反向查詢。

through

在使用ManyToManyField字段時(shí),Django將自動(dòng)生成一張表來管理多對(duì)多的關(guān)聯(lián)關(guān)系。

但我們也可以手動(dòng)創(chuàng)建第三張表來管理多對(duì)多關(guān)系,此時(shí)就需要通過through來指定第三張表的表名。

through_fields

設(shè)置關(guān)聯(lián)的字段。

db_table

默認(rèn)創(chuàng)建第三張表時(shí),數(shù)據(jù)庫(kù)中表的名稱。

多對(duì)多關(guān)聯(lián)關(guān)系的三種方式?

方式一:自行創(chuàng)建第三張表


Django中ORM介紹和字段及字段參數(shù)

方式二:通過ManyToManyField自動(dòng)創(chuàng)建第三張表


Django中ORM介紹和字段及字段參數(shù)

方式三:設(shè)置ManyTomanyField并指定自行創(chuàng)建的第三張表


Django中ORM介紹和字段及字段參數(shù)

注意:

當(dāng)我們需要在第三張關(guān)系表中存儲(chǔ)額外的字段時(shí),就要使用第三種方式。

但是當(dāng)我們使用第三種方式創(chuàng)建多對(duì)多關(guān)聯(lián)關(guān)系時(shí),就無法使用set、add、remove、clear方法來管理多對(duì)多的關(guān)系了,需要通過第三張表的model來管理多對(duì)多關(guān)系。

元信息

ORM對(duì)應(yīng)的類里面包含另一個(gè)Meta類,而Meta類封裝了一些數(shù)據(jù)庫(kù)的信息。主要字段如下:

db_table

ORM在數(shù)據(jù)庫(kù)中的表名默認(rèn)是app_類名,可以通過db_table可以重寫表名。

index_together

聯(lián)合索引。

unique_together

聯(lián)合唯一索引。

ordering

指定默認(rèn)按什么字段排序。

只有設(shè)置了該屬性,我們查詢到的結(jié)果才可以被reverse()。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI