自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

理解Django中的數(shù)據(jù)庫關(guān)系

譯文
數(shù)據(jù)庫 其他數(shù)據(jù)庫
處理好表關(guān)系是創(chuàng)建可靠數(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)用程序上注冊的居民只能有一份個人資料。此外,沒有用戶,個人資料就沒法存在。

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
name = models.CharField(max_length=80, blank=True)
bio = models.TextField(max_length=254, blank=True)
profile_picture = CloudinaryField('profile_picture', default='default.png')
location = models.CharField(max_length=50, blank=True, null=True)
email = models.EmailField(null=True)

def __str__(self):
return f'{self.user.username} profile'

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)系。下列代碼顯示了將密鑰放在哪里。

class NeighbourHood(models.Model):
admin = models.ForeignKey("Profile", on_delete=models.CASCADE, related_name='hood')
name = models.CharField(max_length=50)
location = models.CharField(max_length=60)
hood_logo = CloudinaryField('hood_logo', default='default.png')
description = models.TextField()
health_tell = models.IntegerField(null=True, blank=True)
police_number = models.IntegerField(null=True, blank=True)
Count= models.IntegerField(null=True, blank=True)

def __str__(self):
return f'{self.name} hood'

您可以在該應(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)該同時放在兩個模型中。

class Post(models.Model):
title = models.CharField(max_length=120, null=True)
post = models.TextField()
date = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='post_owner')
hood = models.ForeignKey(NeighbourHood, on_delete=models.CASCADE, related_name='hood_post')
business = models.ManyToManyField(Business)

def __str__(self):
return f'{self.title} post'

現(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/

責(zé)任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2011-06-07 17:14:15

關(guān)系型數(shù)據(jù)庫壓縮技術(shù)

2011-07-18 09:54:47

云計算分片關(guān)系數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫

2011-03-15 11:19:45

DB2數(shù)據(jù)庫catalog

2011-03-24 17:49:47

數(shù)據(jù)庫恢復(fù)

2011-10-11 17:07:12

數(shù)據(jù)庫Internet文件數(shù)據(jù)庫

2021-09-06 10:24:12

鴻蒙HarmonyOS應(yīng)用

2010-09-15 14:09:01

GraphDataba

2011-04-13 16:13:53

云計算關(guān)系型數(shù)據(jù)庫

2009-03-26 09:58:55

云計算關(guān)系型數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫

2020-03-14 16:37:09

數(shù)據(jù)庫IT技術(shù)

2021-09-03 15:41:00

鴻蒙HarmonyOS應(yīng)用

2024-06-06 16:50:15

2016-08-23 14:25:19

MySQL約束數(shù)據(jù)庫

2010-04-15 12:53:42

Oracle數(shù)據(jù)庫

2023-10-16 13:26:00

RDBMS關(guān)系數(shù)據(jù)庫

2018-07-18 09:16:39

關(guān)系型非關(guān)系型數(shù)據(jù)庫

2011-04-14 09:46:12

DB2數(shù)據(jù)庫catalog

2018-03-26 12:58:52

數(shù)據(jù)庫OracleMySQL

2020-05-07 18:39:15

數(shù)據(jù)庫閉源開源

2011-05-13 13:38:49

數(shù)據(jù)庫對象
點贊
收藏

51CTO技術(shù)棧公眾號