django模型多對一 多對多 一對一三種關係解讀

2022-05-17 20:03:38 字數 2842 閱讀 9063

作用:設計的好,會清晰,且易於理解,後續開發也事半功倍,易於維護。

基本原則:

1. 一對一的表,兩表的屬性實際上完全可以合併成乙個表,共用乙個主鍵即可;

2. 一對多的表,可以設中間關聯表,也可以將關聯表併入「多」這頭;若設獨立關聯表,則可引入「多」這頭的主鍵作為其主鍵,也可另立主鍵並將「一」和「多」兩表的主鍵作為關聯表的外來鍵;

3. 多對多的表,則必須設中間關聯表,關聯表設獨立主鍵,並引入兩個「多」頭的表的主鍵作為關聯表的外來鍵。

4. 能用1對1的,就不用1對多;能用1對多的,就不用多對多,往簡單化方向靠;

5. 能當屬性處理的,盡量當屬性,而不是當實體處理去另立新表,這樣可使問題簡化。

6. 把意義相近聯絡緊密的屬性放在一張表內,而不是拆在多張表中。

foreignkey: 多對一

manytomanyfield:多對多

onetoonefield: 一對一

注 :要求第乙個引數是乙個模型類,需要使用verbose_name才能指定自述名。

廢話不多說,先來個簡單的模型例項:

class category(models.model):

'''文章分類

'''name = models.charfield(max_length=20,verbose_name='文章類別')

number = models.integerfield(default=1,verbose_name='分類數目')

class tags(models.model):

'''文章標籤

'''name = models.charfield(max_length=20,verbose_name='文章標籤')

number = models.integerfield(default=1, verbose_name='標籤數目')

class blog(models.model):

'''部落格

'''title = models.charfield(max_length=100,verbose_name=u'標題')

content = models.textfield(default='',verbose_name=u'正文')

create_time = models.datetimefield(default=timezone.now,verbose_name=u'建立時間')

modify_time = models.datetimefield(auto_now=true,verbose_name=u'修改時間')

click_nums = models.integerfield(default=0,verbose_name=u'點選量')

category = models.foreignkey(category,on_delete=models.cascade,verbose_name=u'文章類別')

tags = models.manytomanyfield(tags,verbose_name=u'文章標籤')

class comment(models.model):

''''''

name = models.charfield(max_length=20,default=u'佚名',verbose_name=u'姓名')

content = models.textfield(verbose_name=u'內容')

create_time = models.datetimefield(auto_now_add=true,verbose_name=u'建立時間')

blog = models.foreignkey(blog,verbose_name=u'部落格')

class person(models.model):

name = models.charfield(max_length=128)

class group(models.model):

name = models.charfield(max_length=128)

members = models.manytomanyfield(person, through='membership

')class membership(models.model):

person = models.foreignkey(person)

group = models.foreignkey(group)

date_joined = models.datefield()

invite_reason = models.charfield(max_length=64)

onetoone::當某個物件想擴充套件自另乙個物件,那可以再這個物件的主鍵上新增一對一的關係。例如:

class place(model.model):

address=models.charfield()

phone=models.integer()

class restaurant(models.model):

place=models.onetoonefield(plase)

說明:這裡建立了乙個』place』資料庫,裡面有一些常用的字段,那接下來我想在已有基礎上新增』restaurant』資料庫,而且不想將已有的字段賦值到』restaurant』模型中,那我們可以新增onetoonefield欄位,指向』place』. (在這裡我們應該使用典型的繼承,它隱含了乙個一對一的關係)

總結:資料庫的這三種關係就是這麼簡單,但在運用的過程中,我們需要結合具體的需求,多對

多經常發生的情景是有標籤(tags)的時;onetoone(一對一):類似於繼承,在設計模型時,可以將多個資料路中共有的字段集中起來,然後使用onetoone,進行關聯。

MySQL關係 一對多 一對一 多對多

將實體與實體的關係,反應到最終資料庫表的設計上,將關係分為三種 一對一,一對多 多對一 和多對多,所有的關係都是表與表之間的關係 一對一 一對一 一張表的一條記錄只能與另外一條記錄進行對應,反之亦然 id p 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭位址 緊急聯絡人 體重 表設計成以上這種形式 ...

資料庫一對一,多對一,多對多的關係

關聯對映 一對多 多對一 存在最普遍的對映關係,簡單來講就如球員與球隊的關係 一對多 從球隊角度來說乙個球隊擁有多個球員 即為一對多 多對一 從球員角度來說多個球員屬於乙個球隊 即為多對一 資料表間一對多關係如下圖 關聯對映 一對一 一對一關係就如球隊與球隊所在位址之間的關係,一支球隊僅有乙個位址,...

Django入門 多對一模型

對於乙個初學者,當看到django中models使用多對一時,一臉的mb!q 為什麼要有一對 一 多對 一 多對多的模型?a 乙個系統中經常會有文章 資料等的對應關係,比如 乙個賬戶只有乙個使用者名稱 乙個賬戶對應這個使用者名稱,這個使用者名稱就是指這個賬戶 乙個作者發布了多個blog 知道這個作者...