F對象和Q對象詳解

F對象

  • 可以使用模型的字段A與字段B進行比較,如果A寫在了等號的左邊,則B出現在等號的右邊,需要通過F對象構造;

list.filter(bread__gte=F(‘bcommit’))
django支持對F()對象使用算數運算
list.filter(bread__gte=F(‘bcommit’)*2)
F()對象中還可以寫作”模型類__列名”進行關聯查詢
list.filter(isDelete=F(‘heroinfo__isDelete’))
對於date/time字段,可與timedelta()進行運算
list.filter(bpub_date__lt=F(‘bpub_date’)+timedelta(days=1))

Q對象

  • Q對象實例化後能夠增加各個條件之間的關係,而且這種寫法用在你不知道用戶到底傳入了多少個參數的時候很方便。
  • 比如默認情況下filter()裏面每個字段的連接都是&,我們使用Q對象通常都是讓它變成|,來進行查詢 。
from django.db.models import Q

query = Q()
q1 = Q()
q1.connector = "AND"  # 連接的條件是AND 代表就是& 
q1.children.append(("email", "[email protected]")) # email代表的是數據庫的字段
q1.children.append(("password", "666"))
 # 等同於:email="[email protected]" & password="666"
q2 = Q()
q2.connector = "AND"  # 同樣q2對象連接條件也是AND 
q2.children.append(("username", "fe_cow")) # 同樣數據庫裏username字段
q2.children.append(("password", "fe_cow666"))
 # 等同於:username="fe_cow" & password="fe_cow666"
query.add(q1, "OR") 
query.add(q2, "OR")
 # query目前裏面的符合條件結果就是: (email="[email protected]" & password="666") |  (username="fe_cow" & password="fe_cow666")
userinfo_obj = models.UserInfo.objects.filter(query).first()
  • 過濾器的方法中關鍵字參數查詢,會合併爲And(),需要進行or查詢,使用Q()對象,Q對象(django.db.models.Q)用於封裝一組關鍵字參數,這些關鍵字參數與”比較運算符”中的相同 。
from django.db.models import Q 
list.filter(Q(pk__lt=6))
  • Q對象可以使用&(and)、|(or)、操作符組合起來,當操作符應用在兩個Q對象時,會產生一個新的Q對象。
list.filter(pk__lt=6).filter(bcomment__gt=10) 
list.filter(Q(pk__lt=6) | Q(bcomment__gt=10))
  • 使用~(not)操作符在Q對象前表示取反
list.filter(~Q(pk__lt=6))
  • 可以使用&|~結合括號進行分組,構造出複雜的Q對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章