Django中的F和Q函數

內容簡介: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')

參考:

相關文章
相關標籤/搜索