1. 程式人生 > >Django-ORM的F查詢和Q查詢

Django-ORM的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()

# 查詢e[email protected]和password=abc123 或者 username=abc和password=xyz123的使用者資訊

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