中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django中ORM介紹和字段及字段參數

發布時間:2020-06-24 08:47:06 來源:網絡 閱讀:518 作者:Python熱愛者 欄目:編程語言

Object Relational Mapping(ORM)

ORM介紹

ORM概念

對象關系映射(Object Relational Mapping,簡稱ORM)模式是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。

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

ORM在業務邏輯層和數據庫層之間充當了橋梁的作用。

ORM由來

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

幾乎所有的軟件開發過程中都會涉及到對象和關系數據庫。在用戶層面和業務邏輯層面,我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關系數據庫中。

按照之前的方式來進行開發就會出現程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重復的。

ORM的優勢

ORM解決的主要問題是對象和關系的映射。它通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。?

ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。

讓軟件開發人員專注于業務邏輯的處理,提高了開發效率。

ORM的劣勢

ORM的缺點是會在一定程度上犧牲程序的執行效率。

ORM用多了SQL語句就不會寫了,關系數據庫相關技能退化...

ORM總結

ORM只是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。

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

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

Django中的ORM

Django項目使用MySQL數據庫

1. 在Django項目的settings.py文件中,配置數據庫連接信息:


Django中ORM介紹和字段及字段參數

2. 在Django項目的__init__.py文件中寫如下代碼,告訴Django使用pymysql模塊連接MySQL數據庫:


Django中ORM介紹和字段及字段參數

Model

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

基本情況:

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

模型的每個屬性都代表一個數據庫字段。

綜上所述,Django為您提供了一個自動生成的數據庫訪問API,詳詢官方文檔鏈接。

Django中ORM介紹和字段及字段參數


快速入門?

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


Django中ORM介紹和字段及字段參數

first_name?last_name是模型的字段。每個字段被指定為一個類屬性,每個屬性映射到一個數據庫列。

上面的Person模型將會像這樣創建一個數據庫表:


Django中ORM介紹和字段及字段參數

一些說明:

表myapp_person的名稱是自動生成的,如果你要自定義表名,需要在model的Meta類中指定?db_table?參數,強烈建議使用小寫表名,特別是使用MySQL作為后端數據庫時。

id字段是自動添加的,如果你想要指定自定義主鍵,只需在其中一個字段中指定?primary_key=True?即可。如果Django發現你已經明確地設置了Field.primary_key,它將不會添加自動ID列。

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

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

Django ORM 常用字段和參數

常用字段

AutoField

int自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。

IntegerField

一個整數類型,范圍在 -2147483648 to 2147483647。

CharField

字符類型,必須提供max_length參數, max_length表示字符長度。

DateField

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

DateTimeField

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

字段合集(爭取記憶)


Django中ORM介紹和字段及字段參數

自定義字段(了解為主)


Django中ORM介紹和字段及字段參數

自定義char類型字段


Django中ORM介紹和字段及字段參數

創建的表結構:

Django中ORM介紹和字段及字段參數

附ORM字段與數據庫實際字段的對應關系


Django中ORM介紹和字段及字段參數

字段參數

null

用于表示某個字段可以為空。

unique

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

db_index

如果db_index=True 則代表著為此字段設置數據庫索引。

default

為該字段設置默認值。

時間字段獨有

DatetimeField、DateField、TimeField這個三個時間字段,都可以設置如下屬性。

auto_now_add

配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。

auto_now

配置上auto_now=True,每次更新數據記錄的時候會更新該字段。


關系字段

ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在 '一對多'中'多'的一方。

ForeignKey可以和其他表做關聯關系同時也可以和自身做關聯關系。

字段參數

to

設置要關聯的表

to_field

設置要關聯的表的字段

related_name

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

例如:

.

Django中ORM介紹和字段及字段參數

當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這么寫:

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

當我們在ForeignKey字段中添加了參數?related_name?后,


Django中ORM介紹和字段及字段參數

當我們要查詢某個班級關聯的所有學生(反向查詢)時,我們會這么寫:

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

related_query_name

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

on_delete

當刪除關聯表中的數據時,當前表與其關聯的行的行為。

models.CASCADE

刪除關聯數據,與之關聯也刪除

models.DO_NOTHING

刪除關聯數據,引發錯誤IntegrityError

models.PROTECT

刪除關聯數據,引發錯誤ProtectedError

models.SET_NULL

刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)

models.SET_DEFAULT

刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)

models.SET

刪除關聯數據,

a. 與之關聯的值設置為指定值,設置:models.SET(值)

b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)


Django中ORM介紹和字段及字段參數

db_constraint

是否在數據庫中創建外鍵約束,默認為True。

OneToOneField

一對一字段。

通常一對一字段用來擴展已有字段。

示例

一對一的關聯關系多用在當一張表的不同字段查詢頻次差距過大的情況下,將本可以存儲在一張表的字段拆開放置在兩張表中,然后將兩張表建立一對一的關聯關系。


Django中ORM介紹和字段及字段參數

字段參數

to

設置要關聯的表。

to_field

設置要關聯的字段。

on_delete

同ForeignKey字段。

ManyToManyField

用于表示多對多的關聯關系。在數據庫中通過第三張表來建立關聯關系。

字段參數

to

設置要關聯的表

related_name

同ForeignKey字段。

related_query_name

同ForeignKey字段。

symmetrical

僅用于多對多自關聯時,指定內部是否創建反向操作的字段。默認為True。

舉個例子:


Django中ORM介紹和字段及字段參數

此時,person對象就沒有person_set屬性。


Django中ORM介紹和字段及字段參數

此時,person對象現在就可以使用person_set屬性進行反向查詢。

through

在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關系。

但我們也可以手動創建第三張表來管理多對多關系,此時就需要通過through來指定第三張表的表名。

through_fields

設置關聯的字段。

db_table

默認創建第三張表時,數據庫中表的名稱。

多對多關聯關系的三種方式?

方式一:自行創建第三張表


Django中ORM介紹和字段及字段參數

方式二:通過ManyToManyField自動創建第三張表


Django中ORM介紹和字段及字段參數

方式三:設置ManyTomanyField并指定自行創建的第三張表


Django中ORM介紹和字段及字段參數

注意:

當我們需要在第三張關系表中存儲額外的字段時,就要使用第三種方式。

但是當我們使用第三種方式創建多對多關聯關系時,就無法使用set、add、remove、clear方法來管理多對多的關系了,需要通過第三張表的model來管理多對多關系。

元信息

ORM對應的類里面包含另一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段如下:

db_table

ORM在數據庫中的表名默認是app_類名,可以通過db_table可以重寫表名。

index_together

聯合索引。

unique_together

聯合唯一索引。

ordering

指定默認按什么字段排序。

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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大兴区| 武胜县| 东乌珠穆沁旗| 阿合奇县| 柞水县| 厦门市| 五大连池市| 左云县| 改则县| 内乡县| 湘西| 徐汇区| 青神县| 延边| 永年县| 宜章县| 重庆市| 桐庐县| 来宾市| 湖南省| 祁连县| 石渠县| 郴州市| 年辖:市辖区| 山西省| 鞍山市| 涿州市| 双柏县| 江北区| 隆回县| 阿城市| 子洲县| 长沙市| 元朗区| 永城市| 昌都县| 福鼎市| 宁南县| 二手房| 应城市| 买车|