Django筆記六之外鍵ForeignKey介紹

来源:https://www.cnblogs.com/hunterxiong/archive/2023/03/23/17249926.html
-Advertisement-
Play Games

每次提交代碼的時候,你是否有為如何寫Commit Message而遲遲按不下提交的時刻呢?然後,死磨硬泡寫了一些並提交後,又被review的小伙伴吐槽了呢?相信很多小伙伴有過這樣的經歷吧? 趁著最近ChatGPT那麼火,就來順手推薦一個可以用於解決這個問題的VS Code插件:vscode-gpto ...


這一篇筆記介紹 Django 系統 model 的外鍵處理,ForeignKey 以及相應的處理方法。

這是一種一對多的欄位類型,表示兩張表之間的關聯關係。

本篇筆記的目錄如下:

  1. on_delete
  2. related_name
  3. related_query_name
  4. 外鍵欄位的保存

1、on_delete

假設有兩個 application,app1 和 app2

app1 下的 某個 model 為 App1

app2 下的 某個 model 為 App2

# app1/models.py
class App1(models.Model):
	app2 = models.ForeignKey("app2.App2", on_delete=models.CASCADE)

# app2/models.py
class App2(models.Model):
	pass

當我們設置 ForeignKey 的時候,有一個 on_delete 參數,主要用於當被關聯的外鍵的數據被刪除時,自身數據的處理。

在我們上面的兩個 model 的例子便是,當 App2 的某個數據被刪除時,關聯了該條數據的 App1 的數據的處理方式。

處理方式主要有以下幾種:

CASCADE
關聯刪除,App2 的數據被刪除時,App1 關聯的數據也被刪除

PROTECT
保護處理,如果 App2 的數據被 App1 關聯,那麼關聯了的 App2 的數據不會被刪除

SET_NULL
置空處理,如果 App2 的數據被刪除,App1 中關聯了該條被刪除的App2的數據這個欄位都會被設置為 NULL

DO_NOTHING
不處理,原數據不會有任何操作,也就是說 App2 的某條數據被刪除,App1 中的引用還在。

但其實這是一種不推薦的做法,因為如果訪問到 App1 中的這條數據,用到了 app2 這個欄位,就會報錯。

2、related_name

ForeignKey 有一個屬性,related_name,用於表示從相關對象到此對象的關係的名稱,僅用於展示,但是如果 related_query_name 欄位沒有被賦值的話,那麼 related_query_name 則會預設使用 related_name 這個值。

註意: related_name 還有一個用途,就是在同一個 class 下麵,如果有兩個欄位都是另一個 model 的外鍵欄位,這時候添加 related_name 用來區分兩個欄位是必須的。

示例如下:

class Entry(models.Model):
	blog_old = models.ForeignKey(Blog, related_name='old_entry')
	blog_new = models.ForeignKey(Blog, related_name='new_entry')

3、related_query_name

這個欄位主要用於反向過濾器的搜索,這個欄位如果沒有單獨賦值,則會預設使用 related_name 的值。

關於反向過濾器,我們可以來看下這個功能,以下是兩個 model:

class Blog(models.Model):
    pass

class Entry(models.Model):
    blog = models.ForeignKey(Blog)

現在我們有一個 Blog 的數據,

blog_1 = Blog.objects.get(id=1)

如果我們想要獲取所有 Entry 表裡 blog 這個欄位的值為 blog_1,怎麼處理呢,一般來說是:

entry_list = Entry.objects.filter(blog=blog_1)

但是因為 blog 這個欄位是 外鍵,所以我們使用 反向過濾器 來處理:

entry_list = blog_1.entry_set.all()

上面就是我們 反向過濾器 的用法,就是使用關聯的model 的名稱的小寫 + '_set' 來操作,這是一個固定用法。

但是如果我們設置了 related_query_name 這個欄位, model名稱小寫+'_set' 的用法就可以廢棄了,可以直接使用 related_query_name 來操作,比如 Entry 如下:

class Entry(models.Model):
    blog = models.ForeignKey(Blog, related_name="entries")

這時候,我們沒有設置 related_query_name 的值,所以會自動使用 related_name 的值,使用 反向過濾器 的方法如下:

entry_list = blog_1.entries.all()

4、外鍵欄位的保存

首先我們先來介紹一下外鍵欄位在資料庫和 model 里的樣子。

在 model 里,以 Entry 為例,我們可以看到,關鍵 blog 欄位,直接命名為 'blog',

但是在資料庫的結構里,我們去查看的話,可以看到該欄位為 blog_id。

當我們獲取了一個 Entry 實例,為 entry_obj,

entry_obj = Entry.objects.get(id=1)

當我們輸出 entry_obj.blog,返回的就是一個 Blog 的實例,是一個 object,

而輸出 entry_obj.blog_id,返回的就是一個int 型的數據。

那麼,我們如何為 Entry 實例保存 blog 欄位呢,
如果我們有一個 blog 實例為 blog_1,那麼可以直接使用:

entry_obj.blog = blod_1
entry_obj.save()

如果我們有某個 Blog 的主鍵 id 為 blog_id,那麼我們可以這樣操作:

entry_obj.blog_id = blod_id
entry_obj.save()

以上就是我們這篇介紹外鍵的全部內容,接下來的筆記我們將介紹 ManyToMany,OneToOne 的用法。

原文鏈接:Django筆記六之外鍵ForeignKey介紹


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ### canvas特性 標簽中的文本只有在瀏覽器下支持canvas標簽時才顯示 行內塊元素 高度設置在標簽屬性上 ### 填充色設置 ctx.fillStyle="#ff0000" ### 線條顏色設置 ctx.strokeStyle="ff0000" ### 線條粗細 ctx.lineWidth ...
  • 備忘錄模式(Memento Pattern):是一種行為型設計模式,在不破壞封裝性的前提下,捕獲一個對象的內部狀態,併在該對象之外保存這個狀態。在JavaScript中,可以使用閉包來實現備忘錄模式。 備忘錄模式通常用於處理用戶界面的狀態。當用戶與應用程式交互時,應用程式會根據用戶的輸入更改其狀態。 ...
  • 在基於vue-next-admin 的 Vue3+TypeScript 前端項目中,可以整合自己的 .NET 後端,前端操作一些功能的時候,為了使用方便全局掛載的對象介面,以便能夠快速處理一些特殊的操作,如消息提示、輔助函數、正則測試等等。本篇隨筆介紹在Vue3+TypeScript 前端項目中全局... ...
  • 眾所周知,網頁的暗黑模式可以減少屏幕反射和藍光輻射,減少眼睛的疲勞感,特別是在夜間使用時更為明顯。其實暗黑模式也給霓虹燈效應(Neon Effect)提供了發揮的環境。 霓虹燈效應是一種視覺效果,其特點是在深色背景上使用鮮艷的顏色來產生強烈的視覺衝擊。這種效應通常用於設計海報、廣告、標誌和網頁等。霓 ...
  • 領域驅動設計(Domain Driven Design,簡稱:DDD)設計思想和方法論早在2005年時候就被提出來,但是一直沒有被重視和推薦使用,直到2015年之後微服務流行之後,再次被人重視和推薦使用。 下麵我來介紹一下DDD設計思想和方法論,同時結合我們在實際項目中應用總結和思考。 目錄 1、為 ...
  • 一、案例背景 電腦包含記憶體(RAM),CPU 等硬體設備,根據如圖所示的“產品等級結構-產品族示意圖”,使用抽象工廠模式實現電腦設備創建過程並繪製類圖 二、實現步驟 根據題意,使用抽象工廠模式並畫出類圖,類圖中應包含一個抽象工廠類 AbstractFactory,PcFactory 和 MacF ...
  • 1. 理解可變性 1.1. 理解測試結果如何隨時間變化 1.2. 可以通過多次運行測試後取平均值來解決 1.3. 因代碼改進而進行的測試叫作回歸測試(regression testing) 1.3.1. 原本的代碼叫作基線(baseline) 1.3.2. 新的代碼叫作樣本(specimen) 1. ...
  • 用Python基於Google Bard做一個互動式的聊天機器人 之前已經通過瀏覽器試過了 Google Bard ,更多細節請看: Try out Google Bard, Will Google Bard beat the ChatGPT?. 現在我們想實現自動化,所以我用Python做一個交互 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...