內容簡介:html
介紹Django中的F和Q做用以及使用方法python
1、F介紹 |
做用:操做數據表中的某列值,F()容許Django在未實際連接數據的狀況下具備對數據庫字段的值的引用,不用獲取對象放在內存中再對字段進行操做,直接執行原生產sql語句操做。sql
一般狀況下咱們在更新數據時須要先從數據庫裏將原數據取出後方在內存裏,而後編輯某些屬性,最後提交。例如:數據庫
obj = Order.objects.get(orderid='12') obj.amount += 1 obj.order.save()
上述方法生成的sql語句爲:express
UPDATE `core_order` SET ..., `amount` = 22 WHERE `core_order`.`orderid` = '12' # ...表示Order中的其餘值,在這裏會從新賦一遍值; 22表示爲計算後的結果
可是咱們本意想生成的sql語句爲:django
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操做。ui
上述代碼中無論 order.amount
的值是什麼,Python都未曾獲取過其值,python作的惟一的事情就是經過Django的F()函數建立了一條SQL語句而後執行而已。spa
須要注意的是在使用上述方法更新過數據以後須要從新加載數據來使數據庫中的值與程序中的值對應:code
order= Order.objects.get(pk=order.pk)
或者使用更加簡單的方法:
order.refresh_from_db()
2、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')
參考: