Django Q和F查詢

Q查詢:對對象的複雜查詢

F查詢:專門取對象中某一列值的操作

Q查詢:

1、Q對象(django.db.models.Q)可以對關鍵字參數進行封裝:

from django.db.models import Q
from login.models import New

news = New.objects.filter(Q(question__startswith='What'))

2、可以組合使用&,| 操作符

當一個操作符作用於兩個Q對象時,會產生一個新的Q對象:

from django.db.models import Q
from login.models import New

news = New.objects.filter(Q(question__startswith='What') | Q(question__startswith='Who'))

3、Q對象可以用~操作符表示否定

from django.db.models import Q
from login.models import New

news = New.objects.filter(Q(question__startswith='What') | ~Q(pub_data__year=2005))

4、Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面

 

Order.objects.get(
    Q(create_time=date(2016, 10, 2)) | Q(create_time=date(2016, 10, 6))
    desc__startswith='Who',
)

 

5、例子

Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
等價於
SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

 

F查詢:

F()允許Django在未實際鏈接數據的情況下具有對數據庫字段的值的引用。通常情況下在更新數據時需要先從數據庫裏將原數據取出後方在內存裏,然後編輯某些屬性,最後提交。例如:

order = Order.objects.get(orderid='123456789')
order.amount += 1
order.save()

上述方法生成的sql語句可以使用connection.queries查看http://www.cnblogs.com/liuq/p/5946166.html

UPDATE `core_order` SET ..., `amount` = 22 WHERE `core_order`.`orderid` = '123456789' 
# ...表示Order中的其他值,在這裏會重新賦一遍值; 22表示爲計算後的結果

但其實想生成的sql語句爲:

UPDATE `core_order` SET ..., `amount` = `amount` + 1 WHERE `core_order`.`orderid` = '123456789'

 這時可以使用F()函數:

from django.db.models import F
from core.models import Order
 
order = Order.objects.get(orderid='123456789')
order.amount = F('amount') - 1
order.save()

需要注意的是在使用上述方法更新過數據之後需要重新加載數據來使數據庫中的值與程序中的值對應

 

 order= Order.objects.get(pk=order.pk) 

#  或者使用更加簡單的方法:

order.refresh_from_db()

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章