1. 程式人生 > 程式設計 >Django中Q查詢及Q()物件 F查詢及F()物件用法

Django中Q查詢及Q()物件 F查詢及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,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',"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查詢及Q()物件 F查詢及F()物件用法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。