国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系)

這篇具有很好參考價值的文章主要介紹了Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??????個人簡介:以山河作禮。
??????:Python領域新星創(chuàng)作者,CSDN實力新星認證,阿里云社區(qū)專家博主,CSDN內容合伙人
????:Web全棧開發(fā)專欄:《Web全棧開發(fā)》免費專欄,歡迎閱讀!
????:文章末尾掃描二維碼可以加入粉絲交流群,不定期免費送書。


Django數據表關聯

Django數據表關聯通過ORM(對象關系映射)技術實現不同模型(Model)之間的關聯,建立表與表之間的關系。

在Django中,有以下三種常見的數據表關聯方式:

  1. 一對一關聯(One-to-One):關系中的每個對象都與另一個對象有且只有一個關聯,例如一個人只有一個身份證號碼。
  2. 一對多關聯(One-to-Many):關系中的一個對象對應另一個對象的多個實例,例如一個班級有多個學生。
  3. 多對多關聯(Many-to-Many:關系中的每個對象都可以與多個其他對象相關聯,例如一個學生可以選擇多個課程,一個課程也可以有多個學生選擇。

Django提供了各種類型的字段來處理這些關聯,例如外鍵ForeignKey(一對多)、OneToOneField(一對一字段)和ManyToManyField(多對多字段)等。通過這些字段,我們可以輕松地創(chuàng)建表與表之間的關聯,接下來我們來簡單了解下。

一對一關系類型

  • OneToOneFiled 繼承自 ForeignKey,在概念上,它類似 unique=TureForeignKey,它與ForeignKey 最顯著的區(qū)別在于反向查詢上,ForeignKey 反向查詢返回的是一個對象實例列表,而 OneToOneFiled
    反向查詢返回的是一個對象實例。
  • 一對一關系類型的使用和場景相對其他兩種關聯關系要少,經常用于對已有 Model 的擴展,例如我們可以對 UserInfo表進行擴展,添加類似用戶昵稱、個性簽名等字段。此時就可以新建一個 Model,并定義一個字段與 UserInfo表一對一關聯。這樣就實現了用戶信息拓展表與 UserInfo 表一對一關聯,下面會用通過實例進行說明。
語法格式
class A(model.Model): 
	...
# 和A表進行1對1
class B(model.Model):
 attr = models.OneToOneField(A)
實例應用

新建 index\models.py 下添加以下代碼:

#新建一對一關用戶信息表拓展表,添加完成后執(zhí)行數據庫遷移同步操作
class ExtendUserinfo(models.Model):
    user=models.OneToOneField(to=UserInfo,on_delete=models.CASCADE)
    signature=models.CharField(max_length=255,verbose_name='用戶簽名',help_text='自建簽名')
    nickname=models.CharField(max_length=255,verbose_name='昵稱',help_text='自建昵稱')

Django添加數據,添加數據的user對象必須是另外一個表的類型,如下所示:

from index.models import UserInfo,ExtendUserinfo
username=UserInfo.objects.create(username="xiaoming",password="******")

# 創(chuàng)建一對一表關聯
ExtendUserinfo.objects.create(user=username,signature="good",nickname="XH")

一對多關系類型

一對多是常用的關系類型,這種類型在數據庫中體現是外鍵關聯關系,它在和其他的 Model 建立關聯同時也和自己建立關聯,用來描述一對多的關系,例如一個作者可以寫很多不同的書,但是這些書又只能對應這一個作者,再比如一本圖書只能屬于一個出版社,一個出版社可以出版很多不同種類的圖書,這就是一對多的關系。
Django 會自動將字段的名稱添加“_id”作為列名,ForgienKey 的定義如下:

model.ForeignKey(to,on_delete,**options)
必填參數

它有兩個必填參數。to,指定所關聯的 Model,它的中取值可以是直接引用其他的 Model,也可以是 Model 所對應的字符串名稱;on_delete,當刪除關聯表的數據時,Django 將根據這個參數設定的值確定應該執(zhí)行什么樣的 SQL 約束。

on_delete 可以理解為 MySQL 外鍵的級聯動作,當主表執(zhí)行刪除操作時對子表的影響,即子表要執(zhí)行的操作,Django 提供的可選值如下所示:

  • CASCADE,級聯刪除,它是大部分 ForeignKey 的定義時選擇的約束。它的表現是刪除了“主”,則“子”也會被自動刪除。
  • PROTECT,刪除被引用對象時,將會拋出 ProtectedError 異常。當主表被一個或多個子表關聯時,主表被刪除則會拋出異常。
  • SET_NULL,設置刪除對象所關聯的外鍵字段為 null,但前提是設置了選項 null 為True,否則會拋出異常。
    +SET_DEFAULT:將外鍵字段設置為默認值,但前提是設置了 default 選項,且指向的對象是存在的。
  • SET(value):刪除被引用對象時,設置外鍵字段為 value。value 如果是一個可調用對象,那么就會被設置為調用后的結果。
  • DO_NOTHING:不做任何處理。但是,由于數據表之間存在引用關系,刪除關聯數據,會造成數據庫拋出異常。
可選參數

除了必填參數以外,ForeignKey 還有一些常用的可選參數需要關注。如下所示:

  • to_field:關聯對象的字段名稱。默認情況下,Django 使用關聯對象的主鍵(大部分情況下是 id),如果需要修改成其他字段,可以設置這個參數。但是,需要注意,能夠關聯的字段必須有 unique=True 的約束。

  • db_constraint:默認值是 True,它會在數據庫中創(chuàng)建外鍵約束,維護數據完整性。通常情況下,這符合大部分場景的需求。如果數據庫中存在一些歷史遺留的無效數據,則可以將其設置為 False,這時就需要自己去維護關聯關系的正確性了。

語法格式
#一個A類實例對象關聯多個B類實例對象
class A(model.Model):
....
class B(model.Model):
    屬性 = models.ForeignKey(多對一中"一"的模型類, ...)
實例應用

修改原來定義的代碼,將出版社與圖書之間修改為一對多的關系,添加如下代碼:

from django.db import models
#新建出版社表
class PubName(models.Model):
    pubname=models.CharField('名稱', max_length=255, unique=True)

# 創(chuàng)建book表
class Book(models.Model):
    title = models.CharField(max_length=30, unique=True, verbose_name='書名')
    # public = models.CharField(max_length=50, verbose_name='出版社')
    price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='定價')
    retail_price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='零售價', default="30")

    # 設置外鍵
    pub = models.ForeignKey(to=PubName, on_delete=models.CASCADE, null=True)  # 創(chuàng)建Foreign外鍵關聯pub,以pub_id關聯

    def __str__(self):
        return "title:%s pub:%s price:%s" % (self.title, self.pub, self.price)

此處需要注意每次更改完 models 都需要進行數據庫遷移操作,依次執(zhí)行以下命令即可:

python manage.py makemigrations
python manage.py migrate

如果遷移失敗,需要刪除數據中的所有表,再重新遷移。

插入數據創(chuàng)建一對多對象,如下所示:

from index.model import *
#創(chuàng)建PubName實例化對象pub1并插入書籍信息
pub1=PubName.objects.create(pubname="清華出版社")
Book.objects.create(title="Python",price="59.00",retail_price="59.00",pub=pub1)
Book.objects.create(title="Redis",price="25.00",retail_price="25.00",pub=pub1)
Book.objects.create(title="Java",price="45.00",retail_price="45.00",pub=pub1)
#創(chuàng)建PubName實例化對象pub2并插入書籍信息
pub2=PubName.objects.create(pubname="北大出版社")
Book.objects.create(title="Django",price="65.00",retail_price="65.00",pub=pub2)
Book.objects.create(title="Flask",price="45.00",retail_price="45.00",pub=pub2)
Book.objects.create(title="Tornado",price="35.00",retail_price="35.00",pub=pub2)

訪問 MySQL 數據庫分別查詢 index_book、index_pubname 數據表(如下所示):

Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系),Web全棧開發(fā),django,sqlite,數據庫

多對多關系

  • 多對多關系也是比較常見的,比如一個作者可以寫很多本書,一本書也可以由很多作者一起完成,那么這時候 Author 和 Book之間就是多對多的關系。
  • Django 通過中間表的方式來實現 Model 之間的多對多的關系,這和 MySQL中實現方式是一致的。這個中間表我們可以自己提供,也可以使用 Django 默認生成的中間表。
ManyToManyFiled定義
ManyToManyFiled(to,**options)

它只有一個必填的參數即 to,與其他兩個關聯詞在一樣,用來指定與當前的 Model 關聯的 Model。

可選參數

當然 ManyToManyFiled 還有一些重要的可選參數,下面我們對它們依次進行介紹:

  • relate_name ForeignKey 中的相同都用于反向查詢。
  • db_table 用于指定中間表的名稱,如果沒有提供,Django 會使用多對多字段的名稱和包含這張表的 Model 的名稱組合起來構成中間表的名稱,當然也會包含 index 前綴。
  • through 用于指定中間表,這個參數不需要設置,Django會自動生成隱式的 through Model。由于 Django可以生成自身默認的中間表,該參數可以讓用戶自己去控制表之間的關聯關系或者增加一些額外的信息。
語法格式
class Author(models.Model):
  ...
class Book(models.Model):
    ...
    authors = models.ManyToManyField(Author)
多對多中間表

創(chuàng)建 Author 與 Book 之間多對多關聯關系,在 Author Model 中添加如下代碼:

books=models.ManyToManyField(to="Book") #創(chuàng)建多對多映射關系

然后再執(zhí)行數據庫遷移命令,刷新數據庫,可以看到如下中間表:

Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系),Web全棧開發(fā),django,sqlite,數據庫

實例應用

插入作者信息數據,如下所示:

author1=Author.objects.create(name="Luncy",email="123456@qq.com") 
author2=Author.objects.create(name="Tom",email="456789@163.com")

因為書籍信息之前已經準備完畢,所以下面我們開始創(chuàng)建多對多映射關系,我們在 Django shell 進行如下操作:

author1.books.add(Book.objects.get(id="1"))
author1.books.add(Book.objects.get(id="2"))
author1.books.add(Book.objects.get(id="3"))
author2.books.add(Book.objects.get(id="1"))
author2.books.add(Book.objects.get(id="4"))
author2.books.add(Book.objects.get(id="5"))
author2.books.add(Book.objects.get(id="3"))
author2.books.add(Book.objects.get(id="6"))
author1.books.add(Book.objects.get(id="6"))
  • 多對多關系在中間表插入數據需要使用 add() 方法,books 是對應的多對多字段。

通過以上代碼就完成多對多關系的創(chuàng)建,最后在 MySQL 中查看多對多相關聯的三張數據表,如下所示:

書籍信息表:

Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系),Web全棧開發(fā),django,sqlite,數據庫

作家信息表:
Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系),Web全棧開發(fā),django,sqlite,數據庫

中間表:

Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系),Web全棧開發(fā),django,sqlite,數據庫文章來源地址http://www.zghlxwxcb.cn/news/detail-519333.html

到了這里,關于Django基礎入門?:DjangoDjango數據表關聯(一對一,一對多,多對多關系)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包