1. 程式人生 > >Django之F和Q查詢

Django之F和Q查詢

django f django q f和q查詢

當一般的查詢語句已經無法滿足我們的需求時,Django為我們提供了F和Q復雜查詢語句。假設場景一:老板說對數據庫中所有的商品,在原價格的基礎上漲價10元,你該怎麽做?場景二:我要查詢一個名字叫xxx,年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麽寫你的ORM語句?


一、F查詢

from django.db.models import F
from app01.models import Book

Book.objects.update(price=F("price")+20)  # 對於book表中每本書的價格都在原價格的基礎上增加20元

就這樣一條簡單的語句就完成了對表中所有商品價格的更新,是不是很方便!如果沒有F查詢,你首先要獲取原價格,再做一個算術運算,然後更新字段。F查詢專門對對象中某列值的操作,不可使用__雙下劃線!


二、Q查詢

Q查詢可以組合使用 “&”, “|” 操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象,Q對象可以用 “~” 操作符放在前面表示否定,也可允許否定與不否定形式的組合。Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面。

from django.db.models import Q

print(Book.objects.filter(Q(id=3))[0])  # 因為獲取的結果是一個QuerySet,所以使用下標的方式獲取結果
print(Book.objects.filter(Q(id=3)|Q(title="Go"))[0])  # 查詢id=3或者標題是“Go”的書
print(Book.objects.filter(Q(price__gte=70)&Q(title__startswith="J")))  # 查詢價格大於等於70並且標題是“J”開頭的書
print(Book.objects.filter(Q(title__startswith="J") & ~Q(id=3)))  # 查詢標題是“J”開頭並且id不是3的書
print(Book.objects.filter(Q(price=70)|Q(title="Python"), publication_date="2017-09-26"))  # Q對象可以與關鍵字參數查詢一起使用,必須把普通關鍵字查詢放到Q對象查詢的後面
from django.db.models import Q

con = Q()
q1 = Q()
q1.connector = "AND"
q1.children.append(("email", "[email protected]"))
q1.children.append(("password", "abc123"))

q2 = Q()
q2.connector = "AND"
q2.children.append(("username", "abc"))
q2.children.append(("password", "xyz123"))

con.add(q1, "OR")
con.add(q2, "OR")

obj = models.UserInfo.objects.filter(con).first()

# 查詢[email protected]和password=abc123 或者 username=abc和password=xyz123的用戶信息

上面的例子就是一個典型的復雜查詢,通過將Q對象實例化來然後增加各個條件之間的關系,而且這種寫法用在你不知道用戶到底會傳入多少個參數的時候很方便!

Django之F和Q查詢