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()