您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Django中Q查詢及F查詢的用法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Django Q/F
#1 環境
Python3.7.3
Django==2.0.6
#2 開始
#2.1 django F()表達式
每次獲取times當前的值,再+1,這樣需要將times值取出,存到內存中
obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save()
雖然 obj.times = F(“times”) + 1
看起來像常規的Python為實例屬性賦值,但實際上它是一個描述數據庫上操作的SQL結構
當Django遇到要給F()實例,它會覆蓋標準的Python運算符來創建一個封裝的SQL表達式;在這個例子中,指示數據庫增加由 obj.times 表示的數據庫字段。
無論 obj.times 的值是或曾是什么,Python永遠不需要知道–完全由數據庫來處理。Python通過Django的F()類做的所有事情僅是參考某個字段創建SQL語法來描述操作。
obj = models.Test.objects.get(name="cox") obj.times = F("times") + 1 obj.save()
因此,F()可以通過以下方式提供性能優勢
直接在數據庫中操作而不是python
減少一些操作所需的數據庫查詢次數
#2.2 F()操作在 obj.save() 后會持續存在
如果times的值是1,那么經過n次save()之后,times的值是2
obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() obj.save() obj.save()
如果times的值是1,那么經過n次save()之后,times的值是1+n,而不是2,就是因為F()操作在 obj.save() 后會持續存在
obj = models.Test.objects.get(name="cox") obj.times = F("times") + 1 obj.save() obj.save() obj.save()
#2.3 F()再過濾(filter)中的使用
獲取表中收入(input_price)大于支出(output_price)的數據
models.Test.objects.filter(input_price__gt=F("output_price"))
Django支持F()對象使用加、減、乘、除、取模和冪運算等算術操作,兩個操作數可以是常數或F()對象
models.Test.objects.filter(input_price__gt=F("output_price")*2)
models.Test.objects.filter(input_price__gt=F("output_price")+F("output_price"))
你還可以在F()對象中使用雙下劃線標記來跨越關聯關系。 帶有雙下劃線的F()對象將引入任何需要的join 操作以訪問關聯的對象
models.Test.objects.filter(authors__name=F('blog__name'))
對于date 和date/time 字段,你可以給它們加上或減去一個timedelta對象
from datetime import timedelta
models.Test.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
#2.4 Django Q()表達式
當我們在查詢的條件中需要組合條件時(例如兩個條件“且”或者“或”)時。我們可以使用Q()查詢對象
from django.db.models import Q models.Author.objects.filter(Q(name="cox") | Q(name="Tom")) # 獲取在Author表中,name等于cox和name等于cox的所有數據 models.Author.objects.filter(Q(name="cox") & Q(age=12))# 獲取在Author表中,name等于cox并且age等于12的所有數據
#2.5 Q()傳入條件查詢
q1 = Q() q1.connector = 'OR' q1.children.append(('name', "cox")) q1.children.append(('name', "Tom")) q1.children.append(('name', "Jeck")) models.Author.objects.filter(q1) # 在Author表中,name等于cox/Tom/Jeck的所有數據
con = Q() q1 = Q() q1.connector = 'OR' q1.children.append(('name', "cox")) q1.children.append(('name', "Tom")) q1.children.append(('name', "Jeck")) q2 = Q() q2.connector = 'OR' q2.children.append(('age', 12)) con.add(q1, 'AND') con.add(q2, 'AND') models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 滿足age等于12 的所有數據
#2.6 Q()非
在Q()語句中,~代表非
models.Author.objects.filter(~Q(name="cox")) # 獲取在Author表中,name不等于cox的所有數據
補充知識:Django 中 Models 的 F()和 Q()函數
1、F() ---- 專門取對象中某列值的操作
F對象允許Django在未實際鏈接數據的情況下具有對數據庫字段的值的引用。
通常情況下我們在更新數據時需要先從數據庫里將原數據取出后方在內存里,然后編輯某些屬性,最后提交。
all = BookInfo.objects.filter(auth="小明") for b in all: price = b.price b.price = price + 10 b.save # 使用F對象來計算 BookInfo.objects.filter(auth="小明").update(price=F("price")+10)
2、Q() ---- 對對象的復雜查詢
Q對象是Django對model查詢中所使用的關鍵字參數進行封裝后的一個對象。
Q對象可以通過 &(與)、 |(或)、 ~(非)運算來組合生成不同的Q對象,便于在查詢操作中靈活地運用。
from django.db.models import Q # 并且條件:與條件查詢 models.User.objects.filter(條件1,條件2,條件n..) models.User.objects.filter(Q(username='老王') & Q(userpass='admin')) # 或者條件:或條件 models.User.objects.fliter(Q(username='老王') | Q(username='老李')) # 取反條件 models.User.objects.filter(~Q(username='老王')) models.User.objects.exclude(username='老王')
關于Django中Q查詢及F查詢的用法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。