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

通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】

這篇具有很好參考價值的文章主要介紹了通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

當使用Django進行數(shù)據(jù)庫操作時,F(xiàn)oreignKey(外鍵)是一種非常有用的字段類型。它允許在數(shù)據(jù)庫表之間創(chuàng)建關(guān)聯(lián)關(guān)系,類似于其他數(shù)據(jù)庫系統(tǒng)中的外鍵概念。通過ForeignKey字段,我們可以建立一個模型與另一個模型的一對多關(guān)系。

以下是一個實際例子,使用ForeignKey字段在Django中創(chuàng)建一對多關(guān)系,初學者可以通過這個實際例子去仔細觀察數(shù)據(jù)表“一對多”關(guān)系是怎么一回事兒。

假設我們正在開發(fā)一個博客應用程序,其中有兩個主要的模型:作者(Author)和文章(Post)。一個作者可以有多篇文章,而一篇文章只能由一個作者撰寫。在這種情況下,我們可以使用ForeignKey字段將文章與作者關(guān)聯(lián)起來。

首先,讓我們創(chuàng)建Author模型和Post模型:

from django.db import models

# Create your models here.

class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    writer = models.ForeignKey(Author, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

在上述代碼中,我們定義了Author模型和Post模型。Post模型中的writer字段是一個ForeignKey字段,它將Post模型與Author模型相關(guān)聯(lián)。on_delete=models.CASCADE參數(shù)表示當關(guān)聯(lián)的作者被刪除時,與該作者關(guān)聯(lián)的所有文章也將被刪除。

接下來,我們可以使用這些模型創(chuàng)建數(shù)據(jù)庫表:

python manage.py makemigrations
python manage.py migrate

現(xiàn)在我們已經(jīng)創(chuàng)建了Author和Post表,我們用下面的代碼來演示數(shù)據(jù)表“一對多”關(guān)系的操作及對數(shù)據(jù)表的影響。

import os
import django

# 設置Dango運行時需要的環(huán)境變量DJANGO_SETTINGS_MODULE
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myshop.settings')

# 加載Django的設置
django.setup()

# 導入模型
from app1.models import Author, Post

# 創(chuàng)建一個作者
author1 = Author(name='wenhao')
author1.save()

# 創(chuàng)建一篇文章,并將其與剛才創(chuàng)建的作者相關(guān)聯(lián)
post1 = Post(title='First Post', content='Hello, World!', writer=author1)
post1.save()

# 再創(chuàng)建一篇文章,也將其與剛才創(chuàng)建的作者相關(guān)聯(lián)
post2 = Post(title='My love', content='I love wang hong', writer=author1)
post2.save()

# 獲取一個作者的所有文章
author_get = Author.objects.get(name='wenhao')
posts_all = author_get.post_set.all()
for post in posts_all:
    print(post)


在上面的代碼中,作者“wenhao”發(fā)表了兩篇文章,文章的title分別為’First Post’和’My love’,通過Post模型的一對多成員writer關(guān)聯(lián)到表 Author。

如果要理解語句posts_all = author_get.post_set.all()中的post_set(),請參看我的另一篇博文,鏈接:https://blog.csdn.net/wenhao_ir/article/details/131668597

上面的代碼運行結(jié)果如下:
通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】,Django,數(shù)據(jù)庫,django,sqlite
可見作者“wenhao”對應的兩篇文章的標題被打印出來了。
這里要多問一句,為什么內(nèi)容沒被打印出來呢?
請注意數(shù)據(jù)表模型中定義的下面語句:

    def __str__(self):
        return self.title

并結(jié)合Python的“魔術(shù)方法“(magic method)或“特殊方法“(special method)去理解這個問題,關(guān)于Python的“魔術(shù)方法“(magic method)或“特殊方法“(special method),請參見鏈接:https://blog.csdn.net/wenhao_ir/article/details/131395984

我們再去觀察一下數(shù)據(jù)表中的內(nèi)容,如下:
通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】,Django,數(shù)據(jù)庫,django,sqlite

通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】,Django,數(shù)據(jù)庫,django,sqlite

大家可以仔細觀察下這兩張表的內(nèi)容,看下Author是怎樣和Post進行一對多關(guān)聯(lián)的。
從上面的數(shù)據(jù)庫截圖中可以看出,在表 app1_post中,外鍵字段的名字為 writer_id,而不是想像中的 writer,這一點要注意,其值就是作者wenhao在表app_author中的id字段。
顯然,光憑數(shù)據(jù)表里的數(shù)據(jù),是無法知道字段表 app1_post中的writer_id是指向表app_author中的數(shù)據(jù),Django肯定在另外的地方記錄下了這種對應關(guān)系,記錄下這種對應關(guān)系的表叫“中間關(guān)系表”,這個“中間關(guān)系表”并沒有在數(shù)據(jù)庫中,目前昊虹君也不知道具體在哪里。不過在Django的某個地方,肯定存在著一個“中間關(guān)系表”,它的內(nèi)容如下:
writer_set→Author
提問:_set 是怎么來的?
答:從writer映射到模型Author 的關(guān)系在數(shù)據(jù)庫中叫做反向關(guān)系,writer_set稱為反向關(guān)系名,即related_name,如果不指定反向關(guān)系名,統(tǒng)就會以"字段名_set"的格式作為其默認反向關(guān)系名。

顯然,如果模型中,有多個“一對多”或“多對多”關(guān)系時,相應的字段名不能相同,否則會引起沖突。為什么?舉個例子,假如另一個模型中也有一個一對多的關(guān)系,這個一對多的關(guān)系指向模型Book,但是這個一對多的關(guān)系的字段名也為writer,那么“中間關(guān)系表”中就會存在一條下面這樣的反向關(guān)系記錄:
writer_set→Book
所以,“中間關(guān)系表”的內(nèi)容如下:

writer_set→Author
writer_set→Book

這樣,通過中間關(guān)系表就無法分清楚到底是哪個writer與Author模型相對應,又是哪個writer與Book模型相對應。
如果不能避免字段名字的相同,就要使用相關(guān)名稱參數(shù)(related_name)來為其在中間關(guān)系表中指定反向關(guān)系名,比如:

writer = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='blogs_writer')
writer = models.ForeignKey(Book, on_delete=models.CASCADE, related_name='book_writer')

經(jīng)上面的兩條代碼指定反向關(guān)系名,便沒有沖突了。
并且用related_name參數(shù)指定反向關(guān)系名后,就可以用這個反向關(guān)系名來訪問相應的字段了,比如下面這個示例:

# 獲取一個作者的所有文章
author_get = Author.objects.get(name='wenhao')
posts_all = author_get.blogs_writer.all()
for post in posts_all:
    print(post)

運行上面的代碼,可得到下面的結(jié)果:
通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】,Django,數(shù)據(jù)庫,django,sqlite

在建立一對多關(guān)系或多對多關(guān)系時,建議大家指定不容易重復的反向關(guān)系名,這樣可以提高代碼的健壯性。

擴展閱讀:
Django中使用反向關(guān)系名稱(related_name)解決由“多對多”關(guān)系引起的字段名字沖突問題引起的遷移命令報錯。文章來源地址http://www.zghlxwxcb.cn/news/detail-519853.html

到了這里,關(guān)于通過一個實際例子說明Django中的數(shù)據(jù)庫操作方法法ForeignKey()的用法【數(shù)據(jù)表“一對多”關(guān)系】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • django對數(shù)據(jù)庫中的表進行重新生成

    django對數(shù)據(jù)庫中的表進行重新生成

    刪除數(shù)據(jù)庫中的表 刪除項目中migrations包下的初始化文件 進入到manage.py目錄下執(zhí)行命令 python manage.py makemigrations 執(zhí)行完上述命令之后,再執(zhí)行命令 python manage.py migrate 就可以啦 最后執(zhí)行 python manage.py runserver 運行我們的Django項目 關(guān)于詳細的數(shù)據(jù)表生成見博文:https://blog.csdn.n

    2024年02月16日
    瀏覽(17)
  • Django的數(shù)據(jù)庫操作中的F對象是什么東西?

    在Django中, F 對象是一個用于表示數(shù)據(jù)庫字段的值的特殊對象。 它允許你在數(shù)據(jù)庫層面進行原子操作,而不需要先將數(shù)據(jù)從數(shù)據(jù)庫中檢索到Python層再進行操作。 F 對象的使用通常涉及到數(shù)據(jù)庫更新,特別是在處理并發(fā)操作時。 以下是 F 對象的主要特性和用法: 原子操作:

    2024年01月18日
    瀏覽(18)
  • 使用Django數(shù)據(jù)庫模型中的ForeignKey()形成數(shù)據(jù)表記錄的父子層次結(jié)構(gòu)

    使用Django數(shù)據(jù)庫模型中的ForeignKey()形成數(shù)據(jù)表記錄的父子層次結(jié)構(gòu)

    可以把ForeignKey()的第1個參數(shù)設置為值 “self” 實際形成數(shù)據(jù)表記錄的父子層次結(jié)構(gòu)。 下面是一個簡單的實例: 在文件 E:Python_projectP_001myshop-testmyshopapp1models.py 中寫入下面的代碼: 啟動數(shù)據(jù)庫… 然后執(zhí)行數(shù)據(jù)庫遷移指令: 接下來在文件 E:Python_projectP_001myshop-testmyshop

    2024年02月16日
    瀏覽(25)
  • Django的數(shù)據(jù)庫模型遷移命令makemigrations和migrate是否會導致數(shù)據(jù)庫中的數(shù)據(jù)丟失?

    Django的數(shù)據(jù)庫模型遷移命令makemigrations和migrate是否會導致數(shù)據(jù)庫中的數(shù)據(jù)丟失?

    我們知道,如果在Django的文件models.py中寫好了數(shù)據(jù)庫模型,要生成對應的數(shù)據(jù)庫,需要執(zhí)行下面兩條命令: 其中命令 makemigrations 是生成遷移執(zhí)行文件,命令 migrate 是執(zhí)行遷移命令。 那么如果修改了數(shù)據(jù)庫模型文件models.py的內(nèi)容,比如新增了一張表,那么是否會造成原來數(shù)據(jù)

    2024年02月12日
    瀏覽(29)
  • Django中數(shù)據(jù)庫模型中的DecimalField字段和IntegerField字段有何區(qū)別?

    在Django的數(shù)據(jù)庫模型中, DecimalField 和 IntegerField 是兩種不同的字段類型,用于存儲數(shù)字數(shù)據(jù)。它們的主要區(qū)別在于支持的數(shù)據(jù)范圍和精度。 IntegerField 是用于存儲整數(shù)值的字段類型。它可以存儲包含正數(shù)、負數(shù)和零在內(nèi)的整數(shù)值。 IntegerField 的取值范圍是由所使用的數(shù)據(jù)庫系

    2024年02月16日
    瀏覽(23)
  • 創(chuàng)建一個django項目詳細說明

    創(chuàng)建一個django項目詳細說明

    1.首先安裝django ? pip install django 2.創(chuàng)建django項目 輸入命令后自動生成相關(guān)文件 manage.py文件:這是管理Django項目的重要命令行工具,它主要用于啟動項目、創(chuàng)建應用和完成數(shù)據(jù)庫的遷移等。 settings.py文件:這是Django項目的配置文件,包含了項目的基本信息、靜態(tài)文件路徑、模

    2024年02月16日
    瀏覽(16)
  • 在Django的數(shù)據(jù)庫模型的類中,通常還會定義一個名叫Meta的內(nèi)部類,這個類有什么作用?

    在Django的數(shù)據(jù)庫模型中, Meta 類是一個內(nèi)部類,用于定義一些與模型相關(guān)的元數(shù)據(jù)(metadata)。它提供了一種在模型類中指定各種選項和配置的方式。 以下是 Meta 類的一些常見用途和作用: 定義模型的數(shù)據(jù)庫表名: 通過 db_table 選項可以指定模型對應的數(shù)據(jù)庫表的名稱。例如

    2024年02月12日
    瀏覽(21)
  • 穩(wěn)了,終于可以通過外網(wǎng)訪問 Sealos 中的數(shù)據(jù)庫了!

    穩(wěn)了,終于可以通過外網(wǎng)訪問 Sealos 中的數(shù)據(jù)庫了!

    喜大普奔,Sealos 中的數(shù)據(jù)庫功能現(xiàn)已全面升級,支持外網(wǎng)訪問! 現(xiàn)在你可以從互聯(lián)網(wǎng)的任何地方訪問 Sealos 中的數(shù)據(jù)庫 ,無論您的應用部署在何種環(huán)境,現(xiàn)在都可以輕松通過外網(wǎng)連接到 Sealos 中的數(shù)據(jù)庫,打破地理限制,提升工作效率和靈活性。 目前數(shù)據(jù)庫是通過 NodePort 暴

    2024年02月05日
    瀏覽(18)
  • 通過sql語句查詢出某個字段在數(shù)據(jù)庫中的某個表

    通過sql語句查詢出某個字段在數(shù)據(jù)庫中的某個表

    新入職的小伙伴,肯定還沒熟悉數(shù)據(jù)庫中表于表的關(guān)系以及表中的字段的含義是什么,就需要進行需求開發(fā),導致會出現(xiàn)對某個字段在哪張表里面都分辨不清,不過不要怕,可以利用已下sql語句快速找到。(要注意的是,此方法可能不適用于所有類型的數(shù)據(jù)庫系統(tǒng),但對于大

    2024年02月16日
    瀏覽(43)
  • Springboot通過前端發(fā)起請求,拿到數(shù)據(jù)庫中的數(shù)據(jù)并生成excel表格,postman請求并下載文件

    Springboot通過前端發(fā)起請求,拿到數(shù)據(jù)庫中的數(shù)據(jù)并生成excel表格,postman請求并下載文件

    springboot版本3.2.0,數(shù)據(jù)庫版本8 mybatisplus版本3.5.4.1 依賴 實體類 實體類中的枚舉類型轉(zhuǎn)換,因調(diào)用方法后還是不能轉(zhuǎn)換類型所以暫未解決 Controller層 postman測試 Excel表格 獲取數(shù)據(jù)成功

    2024年01月18日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包