您好,登錄后才能下訂單哦!
Django之F查詢、Q查詢、事務是什么意思?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
一、F查詢
在上面所有的例子中,我們構造的過濾器都只是將字段值與某個我們自己設定的常量做比較。如果我們要對兩個字段的值做比較,那該怎么做呢?
Django 提供 F() 來做這樣的比較。F() 的實例可以在查詢中引用字段,來比較同一個 model 實例中兩個不同字段的值。
示例:
建表:
from django.db import models class Goods(models.Model): name = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) remain = models.BigIntegerField() sold_out = models.BigIntegerField()
插入模塊
from django.db.models import F,Q
例子:查詢賣出數量大于庫存數的商品名稱
res = models.Goods.objects.filter(sold_out__gt=F('remain')).values_list('name', 'sold_out', 'remain') print(res) # <QuerySet [('襪子', 600, 100), ('夾克', 20, 10)]>
F()可以幫我們取到表中某個字段對應的值來當作我的篩選條件,而不是我認為自定義常量的條件了,實現了動態比較的效果。
Django 支持 F() 對象之間以及 F() 對象和常數之間的加減乘除和取模的操作。基于此可以對表中的數值類型進行數學運算。
例子:將每個商品的價格提高50塊
res1 = models.Goods.objects.update(price=F('price')+100)
引申:如何修改char字段,比如將上面的表中商品名稱全部尾部加上‘清倉’兩個字,如何操作?
這里需要使用2個模塊:Concat 和 Value
from django.db.models.functions import Concat from django.db.models import Value res = models.Goods.objects.update(name=Concat(F('name'), Value('清倉')))
Concat表示進行字符串的拼接操作,參數位置決定了拼接是在頭部拼接還是尾部拼接,Value里面是要新增的拼接值。
二、 Q查詢
filter()方法匯總的逗號get的條件是與的關系,如果要執行更復雜的查詢,比如or的語句,就會用到Q對象。
例子:
查詢賣出數量大于100或者價格小于300的商品名
from django.db.models import F,Q res = models.Goods.objects.filter(Q(sold_out__gt=100)|Q(price__lt=300)).values_list('name', 'sold_out', 'price') print(res) <QuerySet [('襪子清倉', 600, Decimal('129.90')), ('寸衫清倉', 10, Decimal('229.90'))]>
對條件包裹一層Q時候,filter即可支持交叉并的比較符。
# 查詢庫存數是小于等于20,且賣出數不是10的產品 res = models.Goods.objects.filter(Q(remain__lte=20)&~Q(sold_out=12)).values_list('name')
我們可以組合& 和| 操作符以及使用括號進行分組來編寫任意復雜的Q 對象。
同時,Q 對象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢。
# 查詢產品名包含新款或者爆款,且庫存大于60的產品 res = models.Goods.objects.filter(Q(name__contains='新款')|Q(name__contains='爆款'), remain__gt=60).values_list('name')
查詢函數可以混合使用Q 對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q 對象)都將"AND”在一起。但是,如果出現Q 對象,它必須位于所有關鍵字參數的前面。
重點使用方法補充:
實例化Q對象:q = Q() q.connector = 'or' # 默認q之間的條件都是與關系,這里改成or關系 q.children.append(('name','sgt')) # 插入第一個條件,注意這里傳的是一個元祖 q.children.append(('password','123')) # 可以繼續插入條件 # q對象支持直接放入filter括號內,它們之間默認是and關系,可以通過上面的q.connect = 'or'來修改成或關系 models.User.objects.filter(q) # 這里面就是查詢的條件們,它們之間默認是與關系,可以修改成or關系
三、事務
定義:將多個sql語句操作變成原子性操作,要么同時成功,有一個失敗在里面就回滾到原來的狀態,保證數據的完整性和一致性(NoSQL數據庫對事務則是部分支持)
# 事務 # 購買商品 # 產品表中修改數據:賣出數+1,庫存-1 from django.db.models import F from django.db import transaction try : with transaction.atomic(): models.Goods.objects.filter(id=1).update(remain=F('remain')-1, sold_out=F('sold_out')+1) except Exception as e: print(e)
感謝各位的閱讀!看完上述內容,你們對Django之F查詢、Q查詢、事務是什么意思大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。