內容簡介:
介紹Django中的F和Q作用以及使用方法
一、F介紹 |
作用:操作數據表中的某列值,F()允許Django在未實際鏈接數據的情況下具有對數據庫字段的值的引用,不用獲取對象放在內存中再對字段進行操作,直接執行原生產sql語句操作。
通常情況下我們在更新數據時需要先從數據庫里將原數據取出后方在內存里,然后編輯某些屬性,最后提交。例如:
obj = Order.objects.get(orderid='12') obj.amount += 1 obj.order.save()
上述方法生成的sql語句為:
UPDATE `core_order` SET ..., `amount` = 22 WHERE `core_order`.`orderid` = '12' # ...表示Order中的其他值,在這里會重新賦一遍值; 22表示為計算后的結果
但是我們本意想生成的sql語句為:
UPDATE `core_order` SET ..., `amount` = `amount` + 1 WHERE `core_order`.`orderid` = '12'
此時F的使用場景就在於此:
from django.db.models import F from core.models import Order obj = Order.objects.get(orderid='12') obj.amount = F('amount') + 1 obj.save() #生成的sql語句為: UPDATE `core_order` SET ..., `amount` = `core_order`.`amount` + 1 WHERE `core_order`.`orderid` = '12' # 和預計的一樣
當Django程序中出現F()時,Django會使用SQL語句的方式取代標准的Python操作。
上述代碼中不管 order.amount
的值是什么,Python都不曾獲取過其值,python做的唯一的事情就是通過Django的F()函數創建了一條SQL語句然后執行而已。
需要注意的是在使用上述方法更新過數據之后需要重新加載數據來使數據庫中的值與程序中的值對應:
order= Order.objects.get(pk=order.pk)
或者使用更加簡單的方法:
order.refresh_from_db()
二、Q介紹 |
作用:對對象進行復雜查詢,並支持&(and),|(or),~(not)操作符。
基本使用:
from django.db.models import Q search_obj=Asset.objects.filter(Q(hostname__icontains=keyword)|Q(ip=keyword))
如果查詢使用中帶有關鍵字查詢,Q對象一定要放在前面
Asset.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), question__startswith='Who')
參考: