ORM查詢之基於對象的正向查詢與反向查詢

来源:https://www.cnblogs.com/jiarenanhao/archive/2018/11/18/9978813.html
-Advertisement-
Play Games

一、為什麼有正向查詢和反向查詢? 舉例有兩張表,一張表叫書籍表,一張表叫出版社表,他們關係是一對多的關係,書籍是一,出版社是多,因為一本書應該只有一個出版社對應,而出版社可以有多本書對應。 那麼在實際代碼中定義他們關係的類中,設置外鍵的那個屬性"publisher"是在多的那個類中,也就是在書籍這個 ...


 一、為什麼有正向查詢和反向查詢?

舉例有兩張表,一張表叫書籍表,一張表叫出版社表,他們關係是一對多的關係,書籍是一,出版社是多,因為一本書應該只有一個出版社對應,而出版社可以有多本書對應。

那麼在實際代碼中定義他們關係的類中,設置外鍵的那個屬性"publisher"是在多的那個類中,也就是在書籍這個類中,所以在書籍類中,想要知道某一本書對應的出版社,就可以通過實例化一個對象,然後通過他的屬性publisher又實例化一個出版社的對象,拿到對應的出版社,這個按照python的解釋來說,就是正常的通過一個實例化對象,取某一個屬性,很正常,邏輯順序明瞭,被稱之為正向查詢;但是在出版社表中,對應的類中,它只有與自己屬性相關的定義啊,比如出版社名字,地址等等,它沒有屬性是來確定和書籍這個表有關係的,所以,想取某一個出版社對應的有哪些書,用實例化一個對象來操作,行不通,這時這種情況就是反向查詢了。

 

兩種查詢具體怎麼操作,如下:

給出兩個表對應的類定義和生成的數據表:

 

書籍類:

生成的對應數據表:

 

 

 出版社類:

生成的對應數據表:

 

 


 

 

 正向查詢

 現在通過正向查詢,也就是要查詢某本書對應的是哪一個出版社。從上面的表中,我們看到,書籍是有重覆的,但是出版社是一樣的,那麼查詢ID=2的那本書對應的出版社。

 1 from orm測試.models import Book           #導入Book模塊
 2 
 3 b=Book.objects.filter(id=2)[0] 
 4 #當後面不加[0]時,拿到的是一個QuerySet集合,加上就是一個對象,只有對象才能取值。
 5 
 6 
 7 
 8 chubanshe=b.publisher.name    
 9 #b已經是書籍的一個對象,b.publisher又是一個對象,這個對象就是出版社的對象,因為#publisher是Book類中的一個外鍵。b.publisher.name就拿到了對應的出版社名字。
10 
11 print(chubanshe)    

來看看上面代碼每一步拿到的都是些什麼。

代碼:b=Book.objects.filter(id=2)拿到的是什麼(不加[0])?如圖:

b拿到的是一個QuerySet集合,類型是django類型的類(這個是什麼具體還不清楚),但是這個肯定不是我想要的對象。

 

 

代碼:b=Book.objects.filter(id=2)[0]拿到的是什麼?如圖:

b輸出是一個具體的值?但是實際上並不是,列印它的類型一看就知道,它其實是一個類實例化的一個對象,也就是想要查詢id=2這本書叫“三國演義”的對象。

 

 

代碼:chubanshe=b.publisher.name拿到的是什麼?

分開來看這句代碼,先看chubanshe=b.publisher是什麼?先把b.publisher的值賦給了chubanshe,方便輸出查看。

首先publisher是Book類的一個屬性,同時也是一個外鍵,很明顯b.publisher是在拿屬性的值。看看它拿到的是什麼?如圖:

看到,結果是跟上面一樣,也是一個具體的值,其實就是出版社的一個實例化的一個對象。好了,到這裡明白了,既然出版社的一個實例化的對象有了,那麼取裡面屬性的值就很好辦了。

代碼chubanshe=b.publisher.name拿到的自然就是從一開始想要得到那本書本的對應的出版社的名字:

結果就是想要的,對應的出版社,查表可以確定結果只正確的,並且這個值的類型是字元串類型,一個真正的值。

 

 

 反向查詢

 現在通過反向查詢,也就是要查詢某個出版社對應哪些書。那麼查詢ID=2這個出版社有哪些書。

既然是反向,出發點一定是從表出版社出發,查到表書籍。

1 1 from orm測試.models  import Publish
2 2 
3 3 p=Publish.objects.filter(id=2)[0]         #這裡跟正向查詢一樣,拿到一個對象
4 4 
5 5 ret=p.book_set.values("title").distinct()    #取出版社對應的所有書
6 6 
7 7 print(ret)

這裡主要分析代碼ret=p.book_set.values("title").distinct()

book_set是反向查詢的一個方法,book對應的就是要到Book表裡面,_set就是拿到了要查詢的所有書籍,distinct()是去重。

結果如圖:

 


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

-Advertisement-
Play Games
更多相關文章
  • sorted()方法 sorted()可用於任何一個可迭代對象。 原型為sorted(iterable, cmp=None, key=None, reverse=False) iterable:一個可迭代對象; cmp:用於比較的函數,比較什麼由key決定; key:用列表元素的某個屬性或函數進行作 ...
  • 前言 這部修改器製作有一段時間了,但是一直沒出教程。今天利用周末空閑寫篇教程,給後來者指路的同時也加深自己對游戲修改器的理解,大佬就隨便看看吧 瀏覽了一下網路,形形色色的單機游戲修改器教程,但是基本只實現了一到兩個功能,GUI圖形界面也沒有。網站上能下載到的實現很多功能的修改器卻又不開源,對新手不夠 ...
  • 一、前言 FPGA以擅長高速並行數據處理而聞名,從有線/無線通信到圖像處理中各種DSP演算法,再到現今火爆的AI應用,都離不開卷積、濾波、變換等基本的數學運算。但由於FPGA的硬體結構和開發特性使得其對很多演算法不友好,之前本人零散地總結和轉載了些基本的數學運算在FPGA中的實現方式,今天做一個系統的總 ...
  • tuple_lst = [ ('元祖容器可哈希',), ('元祖中的元素不可直接修改',), ('元祖可迭代',), ('查',), ('練習',), ] 元祖容器可哈希 >>>hash((1,)) 3430019387558 元祖中的元素不可直接修改 >>>tu = (1, 2, 3, [4]) ...
  • 一、configparser 該模塊適用格式與windows ini文件類似的配置文件,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值) 二、創建對象 三、寫入到文件 四、讀取文件信息 1. 讀取文件 2. 讀取章節信息 DEFAULT章節特殊,它是給每個章節都配備的信息 3. ...
  • 1. jupyter notebook 安裝 創建 jupyter 目錄 創建獨立的 Python3 運行環境,並激活進入該環境 安裝 jupyter 2. jupyter notebook 配置 創建 notebooks 目錄 用於保存網頁端創建的 ipynb 文件。 生成配置文件 生成的配置文件 ...
  • 比較兩個變數的值和類型;==比較兩個變數的值,不比較數據類型。 比如 $a = '123'; $b = 123; $a $b為假; $a == $b為真; 有些情況下不能使用==,可以使用 ,比如: <?php $a = 'abc'; $b= 'a'; if(strpos($a,$b) false) ...
  • 一、 shelve shelve提供python的持久化操作。 持久化:把數據寫到硬碟上 shelve操作與字典非常類似 文件關閉後無法讀取其內容 遍歷: 二、 writeback 把修改的內容自動回寫到文件中 1. 修改內容 shelve.open()預設writeback=False,所以,在默 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...