Django ORM 的常用字段類型、外鍵關聯的跨表引用技巧,以及 `_` 和 `__` 的使用場景


一、Django ORM 常用字段類型

1. 基礎字段類型
字段類型說明示例
CharField字符串字段,必須指定 max_lengthname = models.CharField(max_length=50)
IntegerField整數字段age = models.IntegerField()
BooleanField布爾值字段is_active = models.BooleanField()
DateField / DateTimeField日期/日期時間字段,auto_now_add=True 自動設置創建時間created_at = models.DateTimeField(auto_now_add=True)
EmailField專用于郵箱的 CharField(自帶基礎格式驗證)email = models.EmailField()
TextField長文本字段(不限長度)content = models.TextField()
FileField / ImageField文件/圖片上傳字段(需 Pillow 庫支持 ImageFieldavatar = models.ImageField(upload_to='avatars/')

2. 關聯字段類型
字段類型說明示例
ForeignKey外鍵(一對多關聯)author = models.ForeignKey('Author', on_delete=models.CASCADE)
OneToOneField一對一關聯(常用于擴展用戶模型)profile = models.OneToOneField(User, on_delete=models.CASCADE)
ManyToManyField多對多關聯(自動創建中間表)tags = models.ManyToManyField('Tag')

關鍵參數說明:

  • on_delete: 關聯對象刪除時的行為(必填),常見選項:
    • CASCADE: 級聯刪除(默認)
    • SET_NULL: 設為 null(需字段允許 null=True
    • PROTECT: 阻止刪除
  • related_name: 反向查詢時的名稱(默認 模型名_set,如 book_set

二、跨表引用技巧

1. 正向查詢(直接通過外鍵訪問)
# 模型定義
class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name="books")# 示例:查詢某本書的作者
book = Book.objects.get(id=1)
author_name = book.author.name  # 直接通過外鍵訪問
2. 反向查詢(通過關聯模型反向訪問)
# 示例:查詢某作者的所有書籍
author = Author.objects.get(id=1)
books = author.books.all()  # 使用 related_name 定義的名稱(默認是 book_set)
3. 跨表過濾(使用雙下劃線 __)
# 查詢所有書籍的作者名為 "魯迅" 的書籍
books = Book.objects.filter(author__name="魯迅")# 查詢作者出版過書籍數量大于 5 的作者
authors = Author.objects.annotate(book_count=Count('books')).filter(book_count__gt=5)

三、___ 的使用技巧

1. 單下劃線 _
  • 用途:用于關聯字段的數據庫列名或 ORM 內部操作。
  • 示例
    # 訪問外鍵的數據庫列名(author_id)
    book = Book.objects.get(id=1)
    author_id = book.author_id  # 直接獲取外鍵值(無需訪問關聯對象)# 查詢時直接使用字段名
    Book.objects.filter(author_id=1)
    
2. 雙下劃線 __
  • 用途:跨表查詢時連接關聯模型的字段(可鏈式跨多張表)。
  • 示例
    # 查詢作者所在城市為 "北京" 的書籍
    Book.objects.filter(author__city="北京")# 多級跨表:查詢書籍的作者的出版社名稱
    Book.objects.filter(author__publisher__name="人民出版社")
    
3. 雙下劃線與查詢表達式結合
# 查詢價格大于 100 且作者年齡小于 30 的書籍
Book.objects.filter(price__gt=100, author__age__lt=30)# 查詢書名以 "Django" 開頭或作者郵箱包含 "@example.com"
from django.db.models import Q
Book.objects.filter(Q(title__startswith="Django") | Q(author__email__contains="@example.com"))

四、總結

核心技巧
  1. 字段類型選擇

    • 根據數據類型選擇合適字段(如 CharField vs TextField)。
    • 關聯字段注意 on_deleterelated_name 的設置。
  2. 跨表查詢

    • 正向查詢:直接通過外鍵字段訪問關聯對象。
    • 反向查詢:使用 related_name 或默認的 模型名_set
    • 復雜查詢:通過 __ 跨表連接字段。
  3. _ vs __

    • _ 用于數據庫列名或單級字段訪問(如 author_id)。
    • __ 用于跨表查詢(如 author__name)。
性能優化
  • 使用 select_related 預加載外鍵數據(減少查詢次數):
    books = Book.objects.select_related('author').all()  # 一次性加載作者信息
    
  • 使用 prefetch_related 預加載多對多關系:
    authors = Author.objects.prefetch_related('books').all()  # 預加載所有書籍
    

通過靈活組合這些技巧,可以高效操作 Django ORM 處理復雜的數據關系!

好的!反向查詢是 Django ORM 中通過關聯模型(比如外鍵的“被關聯方”)去訪問發起關聯的模型的關鍵操作。它讓跨表查詢更靈活,下面用詳細的示例和場景幫你徹底理解。


一、反向查詢的核心原理

假設有兩個模型:Author(作者)和 Book(書籍),通過外鍵關聯:

class Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
  • 正向查詢:從 Book 訪問 Author(直接通過外鍵字段 author)。
  • 反向查詢:從 Author 訪問所有關聯的 Book 對象(需要借助 related_name 或默認的 book_set)。

二、反向查詢的兩種方式

1. 使用默認的 模型名_set

如果未設置 related_name,Django 會自動生成反向查詢管理器,格式為:關聯模型名的小寫 + _set

# 假設 Book 模型的外鍵未設置 related_name
class Book(models.Model):author = models.ForeignKey(Author, on_delete=models.CASCADE)# 反向查詢:通過 author.book_set 訪問所有書籍
author = Author.objects.get(id=1)
books = author.book_set.all()  # 獲取該作者的所有書籍
2. 使用自定義的 related_name

通過設置 related_name,可以指定更直觀的反向查詢名稱:

class Book(models.Model):author = models.ForeignKey(Author, on_delete=models.CASCADE,related_name='books'  # 自定義反向查詢名稱)# 反向查詢:通過 author.books 訪問所有書籍
author = Author.objects.get(id=1)
books = author.books.all()  # 更直觀的命名

三、反向查詢的常見操作

1. 獲取關聯對象集合
# 查詢作者 "魯迅" 的所有書籍
author = Author.objects.get(name="魯迅")
books = author.books.all()  # 返回 QuerySet
2. 過濾關聯對象
# 查詢作者 "魯迅" 的出版年份大于 2020 的書籍
books = author.books.filter(publish_year__gt=2020)
3. 創建新的關聯對象
# 為作者 "魯迅" 創建一本新書
new_book = author.books.create(title="狂人日記", publish_year=1918)
4. 統計關聯對象數量
# 統計作者 "魯迅" 的書籍數量
book_count = author.books.count()

四、反向查詢在跨表過濾中的使用

反向查詢結合雙下劃線 __,可以在查詢條件中直接穿透關聯模型。

場景1:查詢所有寫過“小說”類書籍的作者
# 模型擴展:書籍增加分類字段
class Book(models.Model):CATEGORY_CHOICES = [('novel', '小說'),('tech', '科技'),]category = models.CharField(max_length=10, choices=CATEGORY_CHOICES)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')# 反向查詢:直接通過 Author 模型過濾
authors = Author.objects.filter(books__category='novel').distinct()
  • books__category:從 Author 穿透到 Bookcategory 字段。
  • distinct():避免重復作者(如果同一作者有多本小說)。
場景2:查詢書籍平均評分大于 4.5 的作者
from django.db.models import Avg# 模型擴展:書籍增加評分字段
class Book(models.Model):rating = models.FloatField(default=0)author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')# 使用 annotate + 反向查詢
authors = Author.objects.annotate(avg_rating=Avg('books__rating')
).filter(avg_rating__gt=4.5)

五、反向查詢的性能優化

1. 使用 prefetch_related 預加載數據

避免 N+1 查詢問題(遍歷作者時,每次訪問 author.books 都會觸發一次查詢):

# 未優化:觸發多次查詢
authors = Author.objects.all()
for author in authors:print(author.books.all())  # 每次循環觸發一次查詢# 優化后:一次性預加載所有作者的書籍
authors = Author.objects.prefetch_related('books').all()
for author in authors:print(author.books.all())  # 無額外查詢
2. 結合 select_relatedprefetch_related
  • select_related:用于外鍵(一對一、多對一)的預加載。
  • prefetch_related:用于多對多、反向查詢的預加載。
# 同時預加載作者和書籍的出版社(假設 Book 有外鍵到 Publisher)
authors = Author.objects.prefetch_related(Prefetch('books', queryset=Book.objects.select_related('publisher'))
).all()

六、總結:反向查詢的核心技巧

操作代碼示例說明
基本反向查詢author.books.all()獲取所有關聯對象
過濾關聯對象author.books.filter(title__contains="Django")根據條件篩選關聯對象
跨表過濾Author.objects.filter(books__rating__gt=4)在查詢條件中使用反向關聯字段
聚合統計Author.objects.annotate(book_count=Count('books'))統計每個作者的書籍數量
預加載優化prefetch_related('books')減少數據庫查詢次數

關鍵點:

  • 始終優先使用 related_name 自定義反向查詢名稱(代碼更清晰)。
  • 在復雜查詢中靈活使用雙下劃線 __ 穿透關聯模型。
  • 大數據量時用 prefetch_relatedselect_related 優化性能。

通過反向查詢,你可以輕松實現從“一”對“多”或“多對多”關系的反向導航,讓數據關聯操作更加靈活高效!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70560.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70560.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70560.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java遞歸求自然數列的前n項和

概述 實現 /*** 數列 1 2 3 ... n ...* 遞歸求數列的前n項和* param n* return*/private static long calSum(long n){if (n1) return 1;else {return ncalSum(n-1); // 前n項的和 即第n項的值前n-1項的和}}測試用例 public static void main(String[] args) {long res1 cal…

【Golang 面試題】每日 3 題(六十五)

?個人博客:Pandaconda-CSDN博客 📣專欄地址:http://t.csdnimg.cn/UWz06 📚專欄簡介:在這個專欄中,我將會分享 Golang 面試中常見的面試題給大家~ ??如果有收獲的話,歡迎點贊👍收藏…

16、Python面試題解析:python中的淺拷貝和深拷貝

在 Python 中,淺拷貝(Shallow Copy) 和 深拷貝(Deep Copy) 是處理對象復制的兩種重要機制,它們的區別主要體現在對嵌套對象的處理方式上。以下是詳細解析: 1. 淺拷貝(Shallow Copy&a…

【Godot4.3】題目與答案解析合并器

免責申明 本文和工具截圖中涉及題庫和題目,均為本人自學使用,并未有商業和傳播企圖。如有侵害,聯系刪改。 概述 筆者本人醫學專業從業人員,編程只是業余愛好。在自己的專業應考學習過程當中: 有時候不太喜歡紙質題庫…

Lm studio本地部署DeepSeek

為什么用Lm studio Ollama官網下載過慢或失敗(Lm默認下載源無法下載,但可以更換下載源)Ollama默認安裝至C盤一部分Nivida顯卡無法吃滿顯存資源一部分AMD顯卡替換rocm文件后無法啟動 Lm studio安裝 官網下載:LM Studio - Discov…

基于Qlearning強化學習的2DoF機械臂運動控制系統matlab仿真

目錄 1.算法仿真效果 2.算法涉及理論知識概要 2.1 2DoF機械臂運動學模型 2.2 Q-learning強化學習算法原理 3.MATLAB核心程序 4.完整算法代碼文件獲得 1.算法仿真效果 matlab2022a仿真結果如下(完整代碼運行后無水印): 仿真操作步驟可參…

Unity貼圖與模型相關知識

一、貼圖 1.貼圖的類型與形狀 貼圖類型 貼圖形狀 2.在Unity中可使用一張普通貼圖來生成對應的法線貼圖(但并不規范) 復制一張該貼圖將復制后的貼圖類型改為Normal Map 3.貼圖的sRGB與Alpha sRGB:勾選此選項代表此貼圖存儲于Gamma空間中…

快速上手 Unstructured:安裝、Docker部署及PDF文檔解析示例

1. 核心概念 1.1 Unstructured簡介 Unstructured 是一個強大的 Python 庫,專注于從非結構化數據中提取和預處理文本信息,廣泛應用于 PDF、Word 文檔、HTML 等多種格式的文件處理。其核心功能包括分區、清理、暫存和分塊,能夠將復雜的非結構化文檔轉換為結構化輸出,為后續…

pyecharts介紹

文章目錄 介紹安裝pyecharts基本使用全局配置選項 折線圖相關配置地圖模塊使用柱狀圖使用 介紹 echarts慮是個由百度開源的數據可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可,而Pyhon是門富有表達力的語言&a…

Fisher信息矩陣與Hessian矩陣:區別與聯系全解析

Fisher信息矩陣與Hessian矩陣:區別與聯系全解析 在統計學和機器學習中,Fisher信息矩陣(FIM)和Hessian矩陣是兩個經常出現的概念,它們都與“二階信息”有關,常用來描述函數的曲率或參數的敏感性。你可能聽說…

python與C系列語言的差異總結(1)

/ 表示浮點除法 // 表示整數除法 print(8/3)print(8//3)布爾型 False/True 首字母大寫 整數的大小是沒有限制的,會根據需要自動增長,僅受限于可用內存的大小。 m**n表示m的n次方 x 4.3 ** 2.4print(x)print(3.5e30 * 2.77e45)print(1000000001.0 *…

Python selenium 庫

Selenium 是一個用于自動化 Web 瀏覽器操作的強大工具,廣泛應用于 Web 應用程序測試、網頁數據抓取和任務自動化等場景。 Selenium 為各種編程語言提供了 API,用作測試。 目前的官方 API 文檔有 C#、JavaScript、Java、Python、Ruby。 安裝 Selenium 和…

vllm部署LLM(qwen2.5,llama,deepseek)

目錄 環境 qwen2.5-1.5b-instruct 模型下載 vllm 安裝 驗證安裝 vllm 啟動 查看當前模型列表 OpenAI Completions API(文本生成) OpenAI Chat Completions API(chat 對話) vllm 進程查看,kill llama3 deep…

Python NumPy庫使用指南:從入門到精通

1. 引言 NumPy(Numerical Python)是 Python 中用于科學計算的核心庫之一。它提供了強大的多維數組對象(ndarray),以及一系列高效的數學函數,能夠輕松處理大規模的數值數據。NumPy 是許多其他科學計算庫(如 Pandas、Matplotlib、Scikit-learn 等)的基礎。 本文將詳細介…

15.2 智能銷售顧問系統技術架構解密:構建企業級知識驅動型對話引擎

智能銷售顧問系統技術架構解密:構建企業級知識驅動型對話引擎 關鍵詞:RAG 架構設計、銷售知識庫系統、LoRA 微調優化、多模態交互引擎、高并發服務部署 1. 系統技術架構全景解析 1.1 核心架構設計圖 #mermaid-svg-UBkTgaR5lf5WfGMa {font-family:"trebuchet ms",…

用PyTorch從零構建 DeepSeek R1:模型架構和分步訓練詳解

DeepSeek R1 的完整訓練流程核心在于,在其基礎模型 DeepSeek V3 之上,運用了多種強化學習策略。 本文將從一個可本地運行的基礎模型起步,并參照其技術報告,完全從零開始構建 DeepSeek R1,理論結合實踐,逐步…

爬蟲基礎入門之爬取豆瓣電影Top250-Re正則的使用

網址:豆瓣電影 Top 250 本案例所需要的模塊 requests (用于發送HTTP請求)re (用于字符串匹配和操作) 確定需要爬取的數據 : 電影的名稱電影的年份電影的評分電影評論人數 一. 發送請求 模擬瀏覽器向服務器發送請求 準備工作 -分析頁面: F12 or 右擊點擊檢查 查看…

力扣hot100——島嶼數量 島嶼問題經典dfs總結

給你一個由 1(陸地)和 0(水)組成的的二維網格,請你計算網格中島嶼的數量。 島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外,你可以假設該網格的四條邊…

FPGA DSP:Vivado 中帶有 DDS 的 FIR 濾波器

本文使用 DDS 生成三個信號,并在 Vivado 中實現低通濾波器。低通濾波器將濾除相關信號。 介紹 用DDS生成三個信號,并在Vivado中實現低通濾波器。低通濾波器將濾除較快的信號。 本文分為幾個主要部分: 信號生成:展示如何使用DDS&am…

MessageAuthenticator

MessageAuthenticator https://coova.github.io/JRadius/ https://coova.github.io/JRadius/ import org.tinyradius.packet.RadiusPacket; import org.tinyradius.util.RadiusUtil; import java.nio.charset.StandardCharsets;public class RadiusAuthUtils {/*** 生成 RADI…