Django多表查詢(ORM)

1、建立表結構

三個表:book、Author、publisher。
書籍和作者是多對多的關系,一本書可以有多個作者,一個作者可以有多本書。
出版社和書籍是一對多的關系,一個出版社可以出版多本書(多方,多方定義外鍵),一本書只能由某一個出版社出版(現實情況可能不同,只是我們這里這樣規定。)

from django.db import models# Create your models here.
class Book(models.Model):title = models.CharField(max_length=100, verbose_name='書名')authors = models.ManyToManyField('Author', verbose_name='作者')publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE, verbose_name='出版社')class Meta:verbose_name = '圖書'verbose_name_plural = '圖書'def __str__(self):return self.titleclass Author(models.Model):name = models.CharField(max_length=50, verbose_name='作者名')date_of_birth = models.DateField(verbose_name='出生日期', blank=True, null=True)class Meta:verbose_name = '作者'verbose_name_plural = '作者'def __str__(self):return self.nameclass Publisher(models.Model):name = models.CharField(max_length=100, verbose_name='出版社名')address = models.CharField(max_length=255, verbose_name='地址', blank=True, null=True)website = models.URLField(verbose_name='網站', blank=True, null=True)class Meta:verbose_name = '出版社'verbose_name_plural = '出版社'def __str__(self):return self.name

2、一對多(ForeignKey)

數據添加

一對多添加數據需要先添加“一”端,否則多端沒有外鍵引用無法添加,所以需要先有出版社信息
我們這里手工添加一個:

Publisher.objects.create(name="中信出版社", address="河北省廊坊市", website="www.publisher.com")

添加書籍信息,所屬”中信出版社“

# 先查詢取得出版社的對象
publisher = Publisher.objects.get(id=1)
book = Book.objects.create(title="射雕英雄傳",  publisher=publisher)
數據查詢

查詢數據有兩個方向,根據多方查詢一方稱為“正向”,根據一方取得多方數據稱為“反向”

正向:有了書籍(多方)數據,查詢出版社數據(一方)

方式:直接用“.”關聯數據

book = Book.objects.filter(title="射雕英雄傳").first()
print(book) # 射雕英雄傳
print(book.publisher) # 中信出版社
print(book.publisher.address) # 河北省廊坊市
反向:有了出版社,查詢書籍

方式:小寫類名_set.all(),book_set.all()

publisher = Publisher.objects.filter(name="中信出版社").first()
# 方式一:用兩步,通過一個變量引用所有書籍
books = publisher.book_set.all()
for book in books:print(book)# 方式二,不要中間變量,直接輸出
print(publisher.book_set.all()[0]) # 輸出 queryset的第一個對象

3、多對多

在后臺,多對多關系在Django里,實際上是將兩個多方的表名作為字段名,新增了一個表,來維護多對多關系。

數據添加

多對多的情況下,雖然兩個都是“多方”,是對稱的。但是在models中構建的時候,是把一個對象名稱+s,作為另一個對象的ManyToManyField字段

class Book(models.Model):authors = models.ManyToManyField('Author', verbose_name='作者')

這樣在編程的時候就不是對稱的,所以添加的時候兩方添加方式是有區別的。

book.authors.add(author1, author2) # book 里面有authors字段,所以這樣添加
author.book_set.add(book1, book2) # author里面沒有books字段
正向,從定義對方字段的那一方開始
# 方式一,傳單獨的對象
rong = Author.objects.filter(name="黃蓉").first() # 這里必須用.first(),否則返回的是queryset,而不是對象
jing = Author.objects.filter(name="郭靖").first()
bird = Book.objects.filter(title="射雕英雄傳").first()
bird.authors.add(rong, jing) # 將rong、jing兩個Author對象關聯到book# 方式二,傳queryset
from django.db.models import Q
authors = Author.objects.filter(Q(name="黃蓉") | Q(name="郭靖"))
bird = Book.objects.filter(title="射雕英雄傳").first()
bird.authors.add(*authors) # 注意前面要用*
# 或者傳id列表,假設1、3為兩個作者的id
bird.authors.add(*[1, 3]) # 注意前面要用*

刪除所有關聯關系,不會刪除對象

bird.authors.clear()
反向,沒有定義另一方字段的一方
bird = Book.objects.get(title="射雕英雄傳")
rong = Author.objects.filter(name="黃蓉").first()
rong.book_set.add(bird) # 也可以添加多本書,如果有的話

創建新對象,并加入關聯對象集

publisher = Publisher.objects.filter(name="中信出版社").first()
author = Author.objects.filter(name="黃蓉").first()
book = author.book_set.create(title="神雕俠侶", publisher=publisher) # 這里創建的是book類,也可以返回創建的對象

刪除對象關聯

author.book_set.remove(bird) # 刪除其中一個對象的關聯
author.book_set.clear() # 刪除所有關聯關系,不會刪除對象
數據查詢

多對多的數據查詢根據“誰定義了以對方表名為名字的字段”也有正向、反向。方法同一對多。

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

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

相關文章

C# 集合表達式和展開運算符 (..) 詳解

集合表達式 (Collection Expressions)基本語法支持的集合類型展開運算符 (..)基本用法實際應用示例創建新集合合并集合與現有API結合性能考慮高級用法多維集合自定義集合注意事項與傳統方式的比較總結集合表達式 (Collection Expressions) C# 12 引入了集合表達式,…

數學視頻動畫引擎Python庫 -- Manim Voiceover 安裝 Installation

文中內容僅限技術學習與代碼實踐參考,市場存在不確定性,技術分析需謹慎驗證,不構成任何投資建議。 Manim Voiceover 是一個為 Manim 打造的專注于語音旁白的插件: 直接在 Python 中添加語音旁白: 無需使用視頻編輯器&…

Git安裝避坑指南:新手村通關秘籍

Git安裝避坑指南:新手村通關秘籍 剛學編程那會兒,Git安裝差點讓我砸鍵盤。滿心歡喜打開官網下載,結果卡在配置上,命令行死活不認識git命令。看著教程里別人行云流水的操作,自己對著報錯信息干瞪眼——這感覺&#xff…

如何修改Siteground max_execution_time值?

這個值在Siteground 上是修改不了的。 以下是來自Siteground 官網的解釋: 由于服務器上全局定義的 PHP 限制,某些 PHP 設置無法更改。最常見的無法更改的 PHP 設置包括: memory_limit max_execution_time max_input_time post_max_size up…

【libm】 11 fmin函數 (fmin.rs)

一、源碼 這段代碼實現了一個符合 IEEE 754-2008 標準的 minNum 函數(在 Rust 中命名為 fmin),該功能在 IEEE 754-2019 標準中已被 minimumNumber 取代。 /* SPDX-License-Identifier: MIT OR Apache-2.0 */ //! IEEE 754-2008 minNum. Thi…

React 英語單詞消消樂一款專為英語學習設計的互動式記憶游戲

📖 項目簡介 英語單詞消消樂 是一款專為英語學習設計的互動式記憶游戲。通過經典的消消樂玩法,讓用戶在輕松愉快的游戲中掌握英語單詞,提高詞匯量和記憶效果。 🎯 項目目標 讓英語學習變得有趣且高效通過游戲化方式增強單詞記憶…

Qt:QPushButton、QRadioButton、QCheckBox

目錄 一、QPushButton 1.認識QPushButton 2.設置按鈕圖標 3.設置按鈕的快捷鍵 二、QRadioButton 常用的信號 按鈕的分組 三、QCheckBox 一、QPushButton 1.認識QPushButton QPushButton繼承自QWidget,所以在上一篇文章中介紹的QWidget的屬性,理…

docker 無法拉取鏡像解決方法

目錄 我在omv中通過后臺頁面拉取alist鏡像總是失敗,原因千奇百怪 今天再戰終于解決首先,到dockerhub找鏡像和wiki進入docker賬號設置 找到里面提示了登錄操作和密碼命令行中執行后會提示成功之后按需配置代理,同時檢查自己的配置檢查 Docker …

安卓10.0系統修改定制化_____安卓9與安卓10系統文件差異 有關定制選項修改差異

在修改安卓10的rom之前。我們需要對rom有簡單的了解。區分安卓10與安卓9之間的差異。了解不同安卓版本之間系統文件的變化以及權限的區別。對于修改一些定制化選項有很大的輔助作用. 通過博文了解?????? 1??????-----安卓10與安卓9之間文件實例對比 了解差異 …

HTML表單元素全面指南:從基礎到實踐

引言 HTML表單是網頁開發中不可或缺的一部分,它為用戶提供了與網站交互的途徑。無論是簡單的登錄頁面還是復雜的數據提交界面,表單元素都扮演著關鍵角色。本文將詳細介紹各種HTML表單元素及其使用方法。 輸入框(input元素) input元素是最基礎也是最靈…

深度學習的核心理論與技術

理解深度學習的基本原理、核心算法和關鍵技術 深度學習的核心理論與技術前言一、深度學習核心理論1. 神經網絡基礎核心內容練習資源2. 反向傳播與梯度下降核心內容練習資源3. 卷積神經網絡(CNN)核心內容練習資源4. 循環神經網絡(RNN&#xff…

LinkedList 鏈表數據結構實現 (OPENPPP2)

🔍 LinkedList 鏈表數據結構實現 (OPENPPP2) 🧱 1. 數據結構設計 LinkedListNode 結構 #mermaid-svg-XDJqt6cHMKxodJLG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XDJqt6cHMKxodJLG .er…

RPC/gRPC入門學習

一、RPC 1.1 RPC概念 RPC Remote Procedure Call, 即遠程過程調用,是一種用于構建分布式系統的理念,在一些資料中被稱為“請求-響應”協議。兩個進程可以位于同一系統中,也可以位于不同的系統中,通過網絡相互連接。 RPC使程…

租車小程序電動車租賃小程序php方案

電動車租賃小程序源碼,開發語言后端php,前端uniapp。四個端:用戶端門店端分銷商端小程序,pc管理后臺。一 用戶端:可以掃門店碼,進入門店詳情頁。也可以通過地圖找車。或者門店列表進入,或者快速…

Python數據分析基礎04:預測性數據分析

相關章節: 《Python數據分析基礎03:探索性數據分析》 《python數據分析基礎02:數據可視化分析》 《Python數據分析基礎01:描述性統計分析》 預測性數據分析(Predictive Analytics) 的深度解析&#xff0…

PFAE(Pyramidal Frequency Attention Extraction)通過頻域注意力機制提高邊界模糊、遮擋等場景的的檢測能力

在偽裝物體檢測中,現有方法多依賴空間局部特征,難以捕捉全局信息,而 Transformer 類方法計算成本高昂。頻率域特征因具備全局建模能力,可有效抑制背景噪聲、提升偽裝物體語義清晰度,但頻域與空域的頻繁轉換會增加計算復…

AE插件安裝方法

Adobe After Effects簡稱AE,是adobe公司開發的一個視頻剪輯及設計軟件,AE軟件能夠實現對素材的非線性編輯而完成畫面的組接,同時還能對任何一部分進行修改,達到想要的結果。AE含有很多腳本、常用的表達式和插件,做動畫…

舵輪時鐘-STM32-28路PWM--ESP8266-NTP時間

1.STM32--PWM生成STM32不具備如此多的PWM,因此采用軟件定時器的方案實現:使用hal庫實現;main.c#include "main.h"#define close1 500#define open 1500#define close 2500// 定時器中斷配置(以TIM2為例) voi…

Redis的單線程和多線程(單Worker線程)

Redis的單線程和多線程 Redis6.0之前是單線程的,6.0之后是多線程的,我們先了解6.0版本之前的單線程Redis。但其實無論6.0之前還是6.0之后,redis用于工作的線程也只有一個,所以也可以說redis一直是單線程的。 Redis單線程 Redis 6.…

OSPFv3基礎

文章目錄 OSPFv3基礎OSPFv3的改進OSPFv2 v3相同OSPFv2 v3不同 🏡作者主頁:點擊! 🤖Datacom專欄:點擊! ??創作時間:2025年07月07日22點31分 OSPFv3基礎 OSPFv3協議號依然為89,在I…