理解Django中的數(shù)據(jù)庫關(guān)系
譯文譯者 | 布加迪
審校 | 孫淑娟
數(shù)據(jù)庫關(guān)系描述不同數(shù)據(jù)庫表之間的關(guān)系。這種關(guān)系決定了如何存儲和檢索數(shù)據(jù)。Django支持數(shù)據(jù)庫表關(guān)系,非常適用于關(guān)系數(shù)據(jù)庫系統(tǒng)(RDBMS)。
關(guān)系類型有賴于應(yīng)用程序的需求及其建模的數(shù)據(jù)。Django模型與數(shù)據(jù)庫之間的良好關(guān)系改善了數(shù)據(jù)維護,這包括改進查詢性能和減少數(shù)據(jù)重復(fù)。
您可以通過探究三種主要類型的關(guān)系,了解Django數(shù)據(jù)庫關(guān)系如何影響應(yīng)用程序性能。
一、數(shù)據(jù)庫關(guān)系
關(guān)系數(shù)據(jù)庫系統(tǒng)支持三種類型的數(shù)據(jù)庫關(guān)系:一對多關(guān)系、多對多關(guān)系和一對一關(guān)系。數(shù)據(jù)庫關(guān)系的類型影響應(yīng)用程序的用例。
Django模型代表應(yīng)用程序中的數(shù)據(jù)庫表。想創(chuàng)建良好的數(shù)據(jù)庫系統(tǒng),必須在表之間建立良好的關(guān)系。數(shù)據(jù)庫關(guān)系決定著如何在應(yīng)用程序中存儲和顯示數(shù)據(jù)。
想了解數(shù)據(jù)庫關(guān)系,不妨先創(chuàng)建一個名為Hoods的Django項目。該應(yīng)用程序?qū)⑹且粋€社區(qū)社交網(wǎng)絡(luò),它將管理各個社區(qū)的社交活動、安全和企業(yè)。
居民可以注冊、登錄和創(chuàng)建個人資料。他們還可以創(chuàng)建貼子和商業(yè)廣告,所有人都能看到。
先創(chuàng)建一個數(shù)據(jù)庫來存儲社區(qū)的所有數(shù)據(jù)。然后,您將創(chuàng)建Profile(個人資料)、NeighborHood(社區(qū))、Business(企業(yè))和Post(帖子)等模型。想創(chuàng)建模型,必須確定數(shù)據(jù)庫表所需的關(guān)系。
二、一對一數(shù)據(jù)庫關(guān)系
一對一關(guān)系意味著一個Django模型中的記錄與另一個模型中的另一個記錄相關(guān)聯(lián)。這兩個記錄相互依賴。在這種情況下,Profile模型依賴User模型來創(chuàng)建居民的個人資料。
因此,每個在該應(yīng)用程序上注冊的居民只能有一份個人資料。此外,沒有用戶,個人資料就沒法存在。
Django的用戶模型是Django中內(nèi)置的驗證模型,不必為它創(chuàng)建一個模型。相反,從django.contrib.auth中導(dǎo)入它。Profile模型上的OneToOneField()定義了一對一關(guān)系。
on_delete=models.CASCADE變量防止刪除其中一條記錄。您必須從兩個表中刪除記錄。
您可以使用Django管理界面在應(yīng)用程序中直觀顯示這些關(guān)系。想登錄到Django管理界面,必須注冊一個管理員用戶,即超級用戶。
在終端運行以下命令,創(chuàng)建一個超級用戶:python manage.py createsuperuser
將提示您輸入用戶名、電子郵件和密碼。完成這些操作后,啟動服務(wù)器。
在瀏覽器中使用URL http://127.0.0.1:8000/admin,打開管理頁面。
您將看到管理頁面,可以使用之前創(chuàng)建的憑據(jù)來登錄。登錄后,您將看到Groups對象和Users對象。Django身份驗證框架管理這兩個模型。在底部,您將看到Profile模型。
打開Profile模型,繼續(xù)添加個人資料。您看到它如下所示:
圖1
注意,您可以選擇為用戶創(chuàng)建個人資料。OneToOneField()數(shù)據(jù)類型讓您可以為經(jīng)過身份驗證的用戶創(chuàng)建個人資料。這就是該應(yīng)用程序管理一對一關(guān)系的方式。
三、一對多數(shù)據(jù)庫關(guān)系
一對多關(guān)系意味著模型中的一條記錄與另一個模型中的多條記錄相關(guān)聯(lián),它也被稱為多對一關(guān)系。
在本例中,一個管理員可以創(chuàng)建多個社區(qū)。但每個社區(qū)只能屬于一個管理員。您可以使用ForeignKey數(shù)據(jù)類型來定義這類關(guān)系。
Django有內(nèi)置的管理界面,不必為它創(chuàng)建一個模型。管理員有權(quán)從管理面板管理內(nèi)容和直觀顯示該應(yīng)用程序。
容納許多記錄的模型將擁有ForeignKey。它將關(guān)系定義為一對多關(guān)系。下列代碼顯示了將密鑰放在哪里。
您可以在該應(yīng)用程序上看到如下圖所示的關(guān)系:
圖2
NeighborHood模型現(xiàn)在有一個管理員。任何人想創(chuàng)建一個社區(qū),都必須擁有管理權(quán)限。一個社區(qū)不能擁有多名管理員。
四、多對多數(shù)據(jù)庫關(guān)系
在多對多關(guān)系中,一個模型中的多個記錄與另一個模型中的其他記錄相關(guān)聯(lián)。比如說,Post模型和Business模型可以擁有彼此的多個記錄。用戶可以在他們的帖子中創(chuàng)建多個商業(yè)廣告,反之亦然。
然而,創(chuàng)建多對多關(guān)系可能導(dǎo)致數(shù)據(jù)不準確。在其他框架中,您必須創(chuàng)建一個新表來連接這兩個表。
為此,Django有一個解決辦法。當(dāng)您使用多對多字段時,它將創(chuàng)建一個新表將兩個表映射到一起。您可以將多對多字段放到兩個模型中的任意一個中,但不應(yīng)該同時放在兩個模型中。
現(xiàn)在,當(dāng)您在管理面板上查看Post模型時,可以將幾家企業(yè)附加到一個帖子上。
圖3
五、Django簡化數(shù)據(jù)庫關(guān)系
為應(yīng)用程序使用的數(shù)據(jù)庫類型決定了如何利用數(shù)據(jù)。Django有一個全面的系統(tǒng),使連接和操作關(guān)系數(shù)據(jù)庫變得很容易。
Django的特性使得從相關(guān)表中存儲和檢索數(shù)據(jù)變得很容易。它有內(nèi)置的API,可以為應(yīng)用程序連接和創(chuàng)建數(shù)據(jù)庫關(guān)系。
數(shù)據(jù)庫關(guān)系決定著應(yīng)用程序的行為。使用一對一關(guān)系、一對多關(guān)系還是多對多關(guān)系,則取決于您自己。
使用Django,您可以在不破壞應(yīng)用程序的情況下配置和測試特性??梢允褂肈jango來保護數(shù)據(jù)庫系統(tǒng),并優(yōu)化開發(fā)者體驗。
原文鏈接:https://www.makeuseof.com/django-database-relationships/