【Django】執行查詢——比較、刪除、復制、批量修改對象

以下述模型為基礎,討論檢索對象的方式方法:

from datetime import datefrom django.db import modelsclass Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=200)email = models.EmailField()def __str__(self):return self.nameclass Entry(models.Model):blog = models.ForeignKey(Blog, on_delete=models.CASCADE)headline = models.CharField(max_length=255)body_text = models.TextField()pub_date = models.DateField()mod_date = models.DateField(default=date.today)authors = models.ManyToManyField(Author)number_of_comments = models.IntegerField(default=0)number_of_pingbacks = models.IntegerField(default=0)rating = models.IntegerField(default=5)def __str__(self):return self.headline

比較對象

要比較兩個模型實例,使用標準的 Python 比較操作符,兩個等號: ==。實際上,這比較了兩個模型實例的主鍵值。

示例如下,兩個比較是等效的。需要注意的是,有的情況下模型的主鍵可能不是id,可能是別的字段名稱,但本質都是在比較主鍵。

>>> some_entry == other_entry
>>> some_entry.id == other_entry.id

刪除對象

刪除單個對象實例

刪除方法方便地被命名為delete()。這個方法立即刪除對象并返回被刪除的對象數以及一個包含每種對象類型的刪除數的字典。

>>> e.delete()
(1, {'blog.Entry': 1})

批量刪除對象實例

所有 QuerySet 都有個 delete() 方法,它會刪除 QuerySet 中的所有成員。

>>> Entry.objects.filter(pub_date__year=2005).delete()
(5, {'webapp.Entry': 5})

要刪除某個模型的所有對象,要查詢得到包含所有對象的 QuerySet,在QuerySet 上使用 delete() 方法

Entry.objects.all().delete()

如何復制模型實例

新建一個模型實例,保存后,將 pk 設置為 None 并將 _state.adding 設置為 True,再次保存就實現了“復制”。

blog = Blog(name="My blog", tagline="Blogging is easy")
blog.save()  # blog.pk == 1blog.pk = None
blog._state.adding = True
blog.save()  # blog.pk == 2

如果模型繼承自另一個模型,則還要將id設置為None。

class ThemeBlog(Blog):theme = models.CharField(max_length=200)django_blog = ThemeBlog(name="Django", tagline="Django is easy", theme="python")
django_blog.save()  # django_blog.pk == 3django_blog.pk = None
django_blog.id = None
django_blog._state.adding = True
django_blog.save()  # django_blog.pk == 4

如果模型還有 ManyToManyField 關聯關系,OneToOneField 關聯關系,要重新配置。

批量修改對象

通過 update() 統一設置 QuerySet 中的所有對象的某個字段。注意此方法設置非關聯字段和 ForeignKey 字段。要更新非關聯字段,請將新值提供為常數。要更新 ForeignKey 字段,請將新值設置為要指向的新模型實例。

# 更新所有pub_date在2007年的Entry,headline修改為"Everything is the same"。
Entry.objects.filter(pub_date__year=2007).update(headline="Everything is the same")

update() 方法會立即應用,并返回查詢匹配的行數。
對于要更新的 QuerySet 唯一的限制是它只能訪問一個數據庫表:模型的主表。您可以基于相關字段進行過濾,但只能更新模型的主表中的列。

對于調用 update 的情況,還可以使用 F 表達式 來根據模型中另一個字段的值來更新字段。這在根據當前值增加計數器時特別有用。例如,要增加博客中每篇文章的 pingback 計數:

>>> Entry.objects.update(number_of_pingbacks=F("number_of_pingbacks") + 1)

在更新中使用 F() 對象時,不能引入連接。

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

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

相關文章

【vue】v-if、v-show、v-for 相關所有面試題總結

v-if 和 v-show 的區別 兩個重點【dom】和【生命周期】 v-if 惰性指令,false 不會被編譯、渲染不會存在 DOM 中切換開銷大,需要重新創建元素值變化,使用 v-if 的組件生命周期執行順序 true 變為 false【組件的銷毀】 beforeDestroy / befor…

[Flutter]shared_preferences基本用法以及可視化管理存儲的key和value類型

shared_preferences 是一個Flutter插件,它提供了一種簡單的方式來在應用程序中存儲和獲取持久化的鍵值對數據。它可以用于存儲應用程序的配置信息、用戶偏好設置、登錄狀態等。 使用 shared_preferences 插件,你可以在應用程序中輕松地保存和讀取數據&a…

Java中線程相關的知識

創建子線程的三種方式: 1.自定義線程任務類繼承線程類,以便繼承其功能,重寫其run方法(里面寫自己需要實現的功能),在main方法調用時創建其任務類實例化對象,然后調用對象的start方法(繼承自父類),即成功創建線程 優點:創建方式簡…

Pandas DataFrame 基本操作實例100個

Pandas 是一個基于NumPy的數據分析模塊,最初由AQR Capital Management于2008年4月開發,并于2009年底開源。Pandas的名稱來源于“Panel Data”(面板數據)和“Python數據分析”(data analysis)。這個庫現在由…

來不及了!大學必須完成的四件事!

老師們常說,上大學就輕松了 其實不然 大學不是人生的終點,而是新的起跑線 不是休息站,而是進入社會的最后沖刺跑道 大學生活苦樂參半,成人世界即將來臨 出了校門,你會發現社會復雜多變,需要不斷學習 稍…

excel中如何使用VLOOKUP和EXACT函數實現區分大小寫匹配數據

在 Excel 中,VLOOKUP 函數默認情況下是不區分大小寫的: 比如下面的案例,直接使用VLOOKUP函數搜索,只會搜索匹配到不區分大小寫的第一個 如果我們想要實現區分大小寫的精確匹配,可以使用 EXACT 函數結合 VLOOKUP 函數 …

【簡說八股】Redisson的守護線程是怎么實現的

Redisson Redisson 是一個 Java 語言實現的 Redis SDK 客戶端,在使用分布式鎖時,它就采用了「自動續期」的方案來避免鎖過期,這個守護線程我們一般也把它叫做「看門狗」線程。 Redission是一個在Java環境中使用的開源的分布式緩存和分布式鎖實…

PyTorch-卷積神經網絡

卷積神經網絡 基本結構 首先解釋一下什么是卷積,這個卷積當然不是數學上的卷積,這里的卷積其實表示的是一個三維的權重,這么解釋起來可能不太理解,我們先看看卷積網絡的基本結構。 通過上面的圖我們清楚地了解到卷積網絡和一般網…

【Javascript】設計模式之發布訂閱模式

文章目錄 1、現實中的發布-訂閱模式2、DOM 事件3、簡單的發布-訂閱模式4、通用的發布-訂閱模式5、先發布再訂閱6、小結 發布—訂閱模式又叫觀察者模式,它定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于…

Mysql深入學習 基礎篇 Ss.02 詳解四類SQL語句

我親愛的對手,亦敵亦友,但我同樣希望你能成功,與我一起,站在人生的山頂上 ——24.3.1 一、DDL 數據定義語言 1.DDL —— 數據庫操作 查詢 查詢所有數據庫 show databases; 查詢當前數據庫 select database(); 創建 create databa…

【簡說八股】Nginx、GateWay、Ribbon有什么區別?

前言 在現代的微服務架構中,Nginx、Gateway 和 Ribbon 都是處理網絡請求和服務的組件,但它們各自扮演的角色和提供的功能有所不同。下面我將詳細解釋它們之間的區別: Nginx Nginx 是一個高性能的 HTTP 和反向代理服務器,它也可…

Golang Vs Java:為您的下一個項目選擇正確的工具

Java 首次出現在 1995 年,由 James Gosling 和 Sun Microsystems 的其他人開發的一種新編程語言。從那時起,Java 已成為世界上最受歡迎和廣泛使用的編程語言之一。Java 的主要特點包括其面向對象的設計、健壯性、平臺獨立性、自動內存管理以及廣泛的內置…

MSMFN

CDFI是彩色多普勒血流成像 輔助信息 作者未提供數據

Codeforces Round 930 (Div. 2)

substr時間復雜度O&#xff08;N&#xff09;&#xff0c;不能一遍遍找&#xff0c;會超時 #include<iostream> #include<algorithm> #include<vector> #include<map> using namespace std; const int N5e510; map<string,int>mp; vector<…

[C++]AVL樹怎么轉

AVL樹是啥 一提到AVL樹&#xff0c;腦子里不是旋了&#xff0c;就是懸了。 AVL樹之所以難&#xff0c;并不是因為結構難以理解&#xff0c;而是因為他的旋轉。 AVL樹定義 平衡因子&#xff1a;對于一顆二叉樹&#xff0c;某節點的左右子樹高度之差&#xff0c;就是該節點的…

5、云原生安全之falco的規則解讀(部分)(上)

文章目錄 1、自定義規則測試1.1、自定義檢測定時任務的規則2、自帶規則詳解部分2.1、意外的出站連接源(類似的還有入站連接)2.2、檢測目錄穿越攻擊2.3、rpm數據庫被修改2.4、數據庫派生新的進程2.5、特權容器啟動2.6、啟動容器掛載到敏感路徑2.7、匹配所有在pod內啟動、并連接…

音視頻數字化(數字與模擬-照相機)

目錄 1、模擬/數字 2、第一臺照相機 3、照相機原理 4、取景方式 5、底片 6、數碼相機 7、數碼相機指標 8、數碼相機分類 (1)單反相機 (2)單電相機 (3)無反相機

2024.03.02藍橋云課筆記

1.scanf與printf取消分隔符的限制方法 示例代碼&#xff1a; int main() { char s[10];scanf("%d[^\n]",s);printf("%s",s);return 0; } 運行&#xff1a; 輸入&#xff1a;Hello World 輸出&#xff1a;Hello World 注&#xff1a;其中[]中是一個正則…

(UE4升級UE5)Selected Level Actor節點升級到UE5

本問所用工具為&#xff1a;AssetDeveTool虛幻開發常用工具https://gf.bilibili.com/item/detail/1104960041 在UE4中 編輯器藍圖有個節點為 Get Selected Level Actors 但在UE5中&#xff0c;藍圖直接升級后&#xff0c;節點失效&#xff0c;如圖&#xff1a; 因為在UE5中&am…

Vue3中Vuex狀態管理庫學習筆記

1.什么是狀態管理 在開發中&#xff0c;我們會的應用程序需要處理各種各樣的數據&#xff0c;這些數據需要保存在我們應用程序的某個位置&#xff0c;對于這些數據的管理我們就稱之為狀態管理。 在之前我們如何管理自己的狀態呢&#xff1f; 在Vue開發中&#xff0c;我們使用…