Django中Q查詢及Q()對(duì)象 F查詢及F()對(duì)象用法
Django Q/F
#1 環(huán)境
Python3.7.3
Django==2.0.6
#2 開(kāi)始
#2.1 django F()表達(dá)式
每次獲取times當(dāng)前的值,再+1,這樣需要將times值取出,存到內(nèi)存中
obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save()
雖然 obj.times = F(“times”) + 1
看起來(lái)像常規(guī)的Python為實(shí)例屬性賦值,但實(shí)際上它是一個(gè)描述數(shù)據(jù)庫(kù)上操作的SQL結(jié)構(gòu)
當(dāng)Django遇到要給F()實(shí)例,它會(huì)覆蓋標(biāo)準(zhǔn)的Python運(yùn)算符來(lái)創(chuàng)建一個(gè)封裝的SQL表達(dá)式;在這個(gè)例子中,指示數(shù)據(jù)庫(kù)增加由 obj.times 表示的數(shù)據(jù)庫(kù)字段。
無(wú)論 obj.times 的值是或曾是什么,Python永遠(yuǎn)不需要知道–完全由數(shù)據(jù)庫(kù)來(lái)處理。Python通過(guò)Django的F()類做的所有事情僅是參考某個(gè)字段創(chuàng)建SQL語(yǔ)法來(lái)描述操作。
obj = models.Test.objects.get(name="cox") obj.times = F("times") + 1 obj.save()
因此,F(xiàn)()可以通過(guò)以下方式提供性能優(yōu)勢(shì)
直接在數(shù)據(jù)庫(kù)中操作而不是python
減少一些操作所需的數(shù)據(jù)庫(kù)查詢次數(shù)
#2.2 F()操作在 obj.save() 后會(huì)持續(xù)存在
如果times的值是1,那么經(jīng)過(guò)n次save()之后,times的值是2
obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() obj.save() obj.save()
如果times的值是1,那么經(jīng)過(guò)n次save()之后,times的值是1+n,而不是2,就是因?yàn)镕()操作在 obj.save() 后會(huì)持續(xù)存在
obj = models.Test.objects.get(name="cox") obj.times = F("times") + 1 obj.save() obj.save() obj.save()
#2.3 F()再過(guò)濾(filter)中的使用
獲取表中收入(input_price)大于支出(output_price)的數(shù)據(jù)
models.Test.objects.filter(input_price__gt=F("output_price"))
Django支持F()對(duì)象使用加、減、乘、除、取模和冪運(yùn)算等算術(shù)操作,兩個(gè)操作數(shù)可以是常數(shù)或F()對(duì)象
models.Test.objects.filter(input_price__gt=F("output_price")*2)
models.Test.objects.filter(input_price__gt=F("output_price")+F("output_price"))
你還可以在F()對(duì)象中使用雙下劃線標(biāo)記來(lái)跨越關(guān)聯(lián)關(guān)系。 帶有雙下劃線的F()對(duì)象將引入任何需要的join 操作以訪問(wèn)關(guān)聯(lián)的對(duì)象
models.Test.objects.filter(authors__name=F('blog__name'))
對(duì)于date 和date/time 字段,你可以給它們加上或減去一個(gè)timedelta對(duì)象
from datetime import timedelta
models.Test.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3))
#2.4 Django Q()表達(dá)式
當(dāng)我們?cè)诓樵兊臈l件中需要組合條件時(shí)(例如兩個(gè)條件“且”或者“或”)時(shí)。我們可以使用Q()查詢對(duì)象
from django.db.models import Q models.Author.objects.filter(Q(name="cox") | Q(name="Tom")) # 獲取在Author表中,name等于cox和name等于cox的所有數(shù)據(jù) models.Author.objects.filter(Q(name="cox") & Q(age=12))# 獲取在Author表中,name等于cox并且age等于12的所有數(shù)據(jù)
#2.5 Q()傳入條件查詢
q1 = Q() q1.connector = 'OR' q1.children.append(('name', "cox")) q1.children.append(('name', "Tom")) q1.children.append(('name', "Jeck")) models.Author.objects.filter(q1) # 在Author表中,name等于cox/Tom/Jeck的所有數(shù)據(jù)
con = Q() q1 = Q() q1.connector = 'OR' q1.children.append(('name', "cox")) q1.children.append(('name', "Tom")) q1.children.append(('name', "Jeck")) q2 = Q() q2.connector = 'OR' q2.children.append(('age', 12)) con.add(q1, 'AND') con.add(q2, 'AND') models.Author.objects.filter(con) # 在Author表中,name等于cox/Tom/Jeck的 并且 滿足age等于12 的所有數(shù)據(jù)
#2.6 Q()非
在Q()語(yǔ)句中,~代表非
models.Author.objects.filter(~Q(name="cox")) # 獲取在Author表中,name不等于cox的所有數(shù)據(jù)
補(bǔ)充知識(shí):Django 中 Models 的 F()和 Q()函數(shù)
1、F() ---- 專門(mén)取對(duì)象中某列值的操作
F對(duì)象允許Django在未實(shí)際鏈接數(shù)據(jù)的情況下具有對(duì)數(shù)據(jù)庫(kù)字段的值的引用。
通常情況下我們?cè)诟聰?shù)據(jù)時(shí)需要先從數(shù)據(jù)庫(kù)里將原數(shù)據(jù)取出后方在內(nèi)存里,然后編輯某些屬性,最后提交。
all = BookInfo.objects.filter(auth="小明") for b in all: price = b.price b.price = price + 10 b.save # 使用F對(duì)象來(lái)計(jì)算 BookInfo.objects.filter(auth="小明").update(price=F("price")+10)
2、Q() ---- 對(duì)對(duì)象的復(fù)雜查詢
Q對(duì)象是Django對(duì)model查詢中所使用的關(guān)鍵字參數(shù)進(jìn)行封裝后的一個(gè)對(duì)象。
Q對(duì)象可以通過(guò) &(與)、 |(或)、 ~(非)運(yùn)算來(lái)組合生成不同的Q對(duì)象,便于在查詢操作中靈活地運(yùn)用。
from django.db.models import Q # 并且條件:與條件查詢 models.User.objects.filter(條件1,條件2,條件n..) models.User.objects.filter(Q(username='老王') & Q(userpass='admin')) # 或者條件:或條件 models.User.objects.fliter(Q(username='老王') | Q(username='老李')) # 取反條件 models.User.objects.filter(~Q(username='老王')) models.User.objects.exclude(username='老王')
以上這篇Django中Q查詢及Q()對(duì)象 F查詢及F()對(duì)象用法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python發(fā)送http請(qǐng)求解析返回json的實(shí)例
下面小編就為大家分享一篇Python發(fā)送http請(qǐng)求解析返回json的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03PyTorch加載自己的數(shù)據(jù)集實(shí)例詳解
這篇文章主要介紹了PyTorch加載自己的數(shù)據(jù)集,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Python機(jī)器學(xué)習(xí)之決策樹(shù)和隨機(jī)森林
本文主要介紹了機(jī)器學(xué)習(xí)之決策樹(shù)和隨機(jī)森林,詳細(xì)的介紹了實(shí)現(xiàn) 原理機(jī)器實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07pytorch實(shí)現(xiàn)CNN卷積神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了pytorch實(shí)現(xiàn)CNN卷積神經(jīng)網(wǎng)絡(luò),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Python編寫(xiě)百度貼吧的簡(jiǎn)單爬蟲(chóng)
這篇文章主要介紹了Python編寫(xiě)百度貼吧的簡(jiǎn)單爬蟲(chóng),簡(jiǎn)單實(shí)現(xiàn)了下載對(duì)應(yīng)頁(yè)碼的頁(yè)面并存為以當(dāng)前時(shí)間命名的html文件,這里分享給大家,拋磚引玉。2015-04-04梯度下降法介紹及利用Python實(shí)現(xiàn)的方法示例
梯度下降算法是一個(gè)很基本的算法,在機(jī)器學(xué)習(xí)和優(yōu)化中有著非常重要的作用,下面這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)梯度下降法的相關(guān)資料,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-07-07Python函數(shù)命名空間和作用域(Local與Global)
這篇文章主要介紹了Python函數(shù)命名空間和作用域分別介紹Local與Global模式,內(nèi)容詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03pandas中.loc和.iloc以及.at和.iat的區(qū)別說(shuō)明
這篇文章主要介紹了pandas中.loc和.iloc以及.at和.iat的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04