溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Django之F查詢、Q查詢、事務(wù)是什么意思

發(fā)布時(shí)間:2020-11-03 09:52:29 來(lái)源:億速云 閱讀:179 作者:小新 欄目:編程語(yǔ)言

Django之F查詢、Q查詢、事務(wù)是什么意思?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!

一、F查詢

在上面所有的例子中,我們構(gòu)造的過(guò)濾器都只是將字段值與某個(gè)我們自己設(shè)定的常量做比較。如果我們要對(duì)兩個(gè)字段的值做比較,那該怎么做呢?

Django 提供 F() 來(lái)做這樣的比較。F() 的實(shí)例可以在查詢中引用字段,來(lái)比較同一個(gè) model 實(shí)例中兩個(gè)不同字段的值。

示例:

建表:

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

例子:查詢賣出數(shù)量大于庫(kù)存數(shù)的商品名稱

res = models.Goods.objects.filter(sold_out__gt=F('remain')).values_list('name', 'sold_out', 'remain')
print(res)
# <QuerySet [('襪子', 600, 100), ('夾克', 20, 10)]>

F()可以幫我們?nèi)〉奖碇心硞€(gè)字段對(duì)應(yīng)的值來(lái)當(dāng)作我的篩選條件,而不是我認(rèn)為自定義常量的條件了,實(shí)現(xiàn)了動(dòng)態(tài)比較的效果。

Django 支持 F() 對(duì)象之間以及 F() 對(duì)象和常數(shù)之間的加減乘除和取模的操作?;诖丝梢詫?duì)表中的數(shù)值類型進(jìn)行數(shù)學(xué)運(yùn)算。

例子:將每個(gè)商品的價(jià)格提高50塊

res1 = models.Goods.objects.update(price=F('price')+100)

引申:如何修改char字段,比如將上面的表中商品名稱全部尾部加上‘清倉(cāng)’兩個(gè)字,如何操作?

這里需要使用2個(gè)模塊: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('清倉(cāng)')))

Concat表示進(jìn)行字符串的拼接操作,參數(shù)位置決定了拼接是在頭部拼接還是尾部拼接,Value里面是要新增的拼接值。

二、 Q查詢

filter()方法匯總的逗號(hào)get的條件是與的關(guān)系,如果要執(zhí)行更復(fù)雜的查詢,比如or的語(yǔ)句,就會(huì)用到Q對(duì)象。

例子:

查詢賣出數(shù)量大于100或者價(jià)格小于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 [('襪子清倉(cāng)', 600, Decimal('129.90')), ('寸衫清倉(cāng)', 10, Decimal('229.90'))]>

對(duì)條件包裹一層Q時(shí)候,filter即可支持交叉并的比較符。

# 查詢庫(kù)存數(shù)是小于等于20,且賣出數(shù)不是10的產(chǎn)品
res = models.Goods.objects.filter(Q(remain__lte=20)&~Q(sold_out=12)).values_list('name')

我們可以組合& 和|  操作符以及使用括號(hào)進(jìn)行分組來(lái)編寫任意復(fù)雜的Q 對(duì)象。

同時(shí),Q 對(duì)象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢。

# 查詢產(chǎn)品名包含新款或者爆款,且?guī)齑娲笥?0的產(chǎn)品
res = models.Goods.objects.filter(Q(name__contains='新款')|Q(name__contains='爆款'), remain__gt=60).values_list('name')

查詢函數(shù)可以混合使用Q 對(duì)象和關(guān)鍵字參數(shù)。所有提供給查詢函數(shù)的參數(shù)(關(guān)鍵字參數(shù)或Q 對(duì)象)都將"AND”在一起。但是,如果出現(xiàn)Q 對(duì)象,它必須位于所有關(guān)鍵字參數(shù)的前面。

重點(diǎn)使用方法補(bǔ)充:

實(shí)例化Q對(duì)象:q = Q()
q.connector = 'or'    #  默認(rèn)q之間的條件都是與關(guān)系,這里改成or關(guān)系
q.children.append(('name','sgt'))  # 插入第一個(gè)條件,注意這里傳的是一個(gè)元祖
q.children.append(('password','123')) # 可以繼續(xù)插入條件
# q對(duì)象支持直接放入filter括號(hào)內(nèi),它們之間默認(rèn)是and關(guān)系,可以通過(guò)上面的q.connect = 'or'來(lái)修改成或關(guān)系
models.User.objects.filter(q)    # 這里面就是查詢的條件們,它們之間默認(rèn)是與關(guān)系,可以修改成or關(guān)系

三、事務(wù)

定義:將多個(gè)sql語(yǔ)句操作變成原子性操作,要么同時(shí)成功,有一個(gè)失敗在里面就回滾到原來(lái)的狀態(tài),保證數(shù)據(jù)的完整性和一致性(NoSQL數(shù)據(jù)庫(kù)對(duì)事務(wù)則是部分支持)

# 事務(wù)
# 購(gòu)買商品
# 產(chǎn)品表中修改數(shù)據(jù):賣出數(shù)+1,庫(kù)存-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)

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)Django之F查詢、Q查詢、事務(wù)是什么意思大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI