Django利用ORM建立表與表之間的外來鍵關係

2022-09-28 04:39:08 字數 3162 閱讀 9395

引子:

我們先用乙個案例來捋一下表與表之間的關係 然後再通過**實現。

book書籍表:

1 水滸傳 10000

2 西遊記 20000

3 三國演義 30000

4 紅樓夢 40000

author作者表:

1 gary 18

2 jack 20

publish出版社表:

1 新華出版社 北京

2 西方出版社 東京

authordetail作者詳情表:

1 ***xx

2 ***xx

關係網:

1、一本書只能由乙個出版社出版(占用版權) 而 乙個出版社可以出多部書籍

# 所以書表和出版社表為一對多的關係 外來鍵建議建在多的哪一方(book)

2、一本書可以由多個作者聯合創作,乙個作者也可以創作多本書

# 所以書籍表與作者表為多對多的關係,多對多的關係則需要另外一張表建立關係

id book_id author_id

1 2 1

2 1 1

3 1 2

4 3 2

# 即:作者1建立了兩本書1 2,書1由作者1和2聯合建立,作者2建立了1和3兩本書

3、作者與作者詳情表肯定是一對一的關係

# models.py

from django.db import models

# create your models here.

class book(models.model):

title = models.charfield(max_length=32,validators='書名')

price = models.decimalfield(max_digits=8,decimal_places=2,validators='**')

# 總共8位小數點站兩位

'''外來鍵關係:圖書和出版社為一對多的關係,所以建在多的一方 外來鍵建在書表裡

'''publish = models.foreignkey(to='publish')

# 注意:如果主鍵欄位不為id的話,需要指定主鍵欄位名(to='nid...')

'''圖書和作者是多對多的關係 外來鍵字段建在任意一方即可 推薦建在查詢頻率較高的一方

'''# 這是乙個虛擬字段,主要是告訴orm這兩個表是多對多的關係,讓orm建立第三張關係表

authors = models.manytomanyfield(to='author')

# 出版社表

class publish(models.model):

name = models.charfield(max_length=32,validators='出版社名字')

addr = models.charfield(max_length=32,validators='出版社位址')

# 作者表

class author(models.model):

name = models.charfield(max_length=32,validators='作者名')

age = models.integerfield(validators='作者年齡')

'''作者與作者詳情為一對一表關係,外來鍵建在任意一方都可以,推薦建立再查詢頻率高的表

'''author_detail =models.onetoonefield(to='authordetail')

# 作者詳情表

class authordetail(models.model):

phone = models.bigintegerfield(validators='作者**') # 通常情況下儲存數字型別比較多的時候使用bigintegerfield

addr = models.charfield(max_length=32,validators='作者位址')

總結:

# 如果字段對應的時foreignkey ,onetoonefield 那麼orm會自動在字段後面加_id

# 如果自己加了_id 那麼orm一樣會繼續再加乙個_id

# 在django1.x版本中外鍵預設都是級聯更新級聯刪除的

補充:

1、在使用to='關聯表名' 建立外來鍵的時候,如果不加''引號關聯表名必須出現在上方

eg:class user:

models.foreignkey(to='publish') # 這樣關聯表在下方不報錯

models.foreignkey(to=publish) # 報錯 這樣的寫法關聯表必須出現在上方

外來鍵字段及引數補充:

1、unique = true   # 可新增約束條件 唯一

# 在使用foreignkey()建立外來鍵字段的時候,為一對多的表關係,但是我們知道一對一的表關係就是在外鍵欄位新增乙個唯一的約束條件,那麼就相當於:

foreignkey(unique=true) === onetoonefield()

# 但是在使用這種方式建立一對一表關係的時候,orm會有乙個提示資訊,orm推薦你使用的是onetoonefield()的方式來建立一對一的表關係,但是前者以可以使用

2、db_index

如果db_index=true 則代表著為此字段設定索引

3、to_field

設定要關聯的表的字段,(預設不寫關聯的就是另外一張的主鍵字段)

eg:to_field='name' # 和關聯表的name欄位新增關聯

4、on_delete

當刪除關聯表中的資料時,當前表與其關聯的行為。 # (django1.x無需使用)

# django2.x及以上版本,需要我們自己指定外來鍵字段的級聯更新,級聯刪除。

Django中ORM建立表關係

一 django中orm建立表關係 1.表與表之間的關係 1.表與表之間的關係 一對多一對一 多對多2.操作目標條件 圖書表出版社表 作者表作者詳情表 3.外來鍵關聯 一對多 圖書和出版社是一對多的關係 外來鍵字段建在多的那一方 book 多對多 圖書和作者是多對多的關係 需要建立第三張表來專門儲存...

利用django建立表結構

在專案資料夾下cmd執行命令 建立system模組 django.contrib.admin django.contrib.auth django.contrib.contenttypes django.contrib.sessions django.contrib.messages django....

django中orm建立表的對應關係

django中的orm支援幫我們建立表與表之間的對應關係。一對一,一對多,及多對多。如我們要建立 圖書表與出版社表是一對多的關係。假設一本書只能由乙個出版社出版 圖書表與作者表之間是多對多的關係。作者表與作者詳情表之間是一對一的關係。models.py class book models.model...