當通常的查詢語句已經沒法知足咱們的需求時,Django爲咱們提供了F和Q複雜查詢語句。假設場景一:老闆說對數據庫中全部的商品,在原價格的基礎上漲價10元,你該怎麼作?場景二:我要查詢一個名字叫xxx,年齡是18歲,或者名字是yyy,年齡是是19歲的人,你該怎麼寫你的ORM語句?
python
1、F查詢 數據庫
from django.db.models import F from app01.models import Book Book.objects.update(price=F("price")+20) # 對於book表中每本書的價格都在原價格的基礎上增長20元
就這樣一條簡單的語句就完成了對錶中全部商品價格的更新,是否是很方便!若是沒有F查詢,你首先要獲取原價格,再作一個算術運算,而後更新字段。F查詢專門對對象中某列值的操做,不可以使用__雙下劃線!django
2、Q查詢app
Q查詢能夠組合使用 「&」, 「|」 操做符,當一個操做符是用於兩個Q的對象,它產生一個新的Q對象,Q對象能夠用 「~」 操做符放在前面表示否認,也可容許否認與不否認形式的組合。Q對象能夠與關鍵字參數查詢一塊兒使用,不過必定要把Q對象放在關鍵字參數查詢的前面。ide
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", "123@qq.com")) 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=123@qq.com和password=abc123 或者 username=abc和password=xyz123的用戶信息
上面的例子就是一個典型的複雜查詢,經過將Q對象實例化來而後增長各個條件之間的關係,並且這種寫法用在你不知道用戶到底會傳入多少個參數的時候很方便!
對象