django教程--model教程之查詢高級(jí)用法

django教程--model教程之查詢高級(jí)用法

上節(jié)教程我們了解了Django中model的基本使用春缕,本節(jié)我們接著上節(jié)內(nèi)容冬念,介紹一些model的高級(jí)用法蛇更。

1.filter查詢
2.聚合函數(shù)
3.字段排序
4.自定義查詢語句

filter查詢

1.字段限制
上節(jié)我們簡(jiǎn)單介紹了filter查詢方式错妖,filter是Django中model的主要查詢方式揭保,通過filter幾乎可以實(shí)現(xiàn)所有查詢組合知押,filter函數(shù)通過參數(shù)傳遞查詢限制條件(主要是字段的限制)叹螟,filter返回QuerySet數(shù)據(jù)集合。如上節(jié)的

querystudent1 = Student.objects.filter(name='xiao ming')

就會(huì)返回所有name字段等于'xiao ming'的QuerySet集合台盯。
由于是通過參數(shù)來傳遞字段限制條件罢绽,例如當(dāng)我們要查詢年齡大于12的學(xué)生,我們并不能直接這樣使用

querystudent1 = Student.objects.filter(age>12)

Django通過字段后加__條件=值的方式來解決這樣的問題静盅,例如上面就可以這樣進(jìn)行查詢

querystudent1 = Student.objects.filter(age__gt=12)

類似的條件有

1.  等于 exact良价。
例:查詢name等于‘xiao ming’的學(xué)生
Student.objects.filter(name='xiao ming')
Student.objects.filter(name__exact='xiao ming')#此處的exact可以省略

2.  模糊查詢 like
    包含 contains
例:查詢姓名包含'xiao'的學(xué)生。
Student.objects.filter(name__contains='xiao')
開頭:startswith  結(jié)尾:endswith
例:查詢姓名以'xiao'開頭的學(xué)生 以'ming'結(jié)尾的學(xué)生
Student.objects.filter(name__startswith='xiao')
Student.objects.filter(name__endswith='ming')

3.  空查詢   isnull
例:查詢姓名不為空的學(xué)生
Student.objects.filter(name__isnull=False)

4.  范圍查詢  in 
例:查詢年齡12或15或16的學(xué)生
Student.objects.filter(age__in=[12,15,16])

5.  比較查詢 gt lt(less than) gte(equal) lte
例:查詢年齡大于等于12的學(xué)生
Student.objects.filter(age__gte=12)

6.  日期查詢  date
例:查詢1994年出生的學(xué)生蒿叠。
Student.objects.filter(birthyear__date=1994)
例:查詢1994年1月1日后出生的學(xué)生明垢。
Student.objects.filter(birthyear__date__gt = date(1994,1,1))

7. 返回不滿足條件的數(shù)據(jù) exclude
例:查詢id不為3的學(xué)生。
Student.objects.exclude(id=3)

2.邏輯運(yùn)算之Q對(duì)象
我們可以同時(shí)傳遞多個(gè)字段參數(shù)限制栈虚,但是這樣傳遞的字段參數(shù)限制為與運(yùn)算袖外,例如

Student.objects.filter(name='xiao ming',age=12)

代表姓名是'xiao ming'并且年齡等于12的學(xué)生集合,但是我們要查詢姓名是'xiao ming'或者年齡等于12該如何使用魂务?這時(shí)候Q對(duì)象曼验,Q對(duì)象可以用來在字段限制間進(jìn)行邏輯運(yùn)算(&,|,~)
上面我們就可以這樣來查詢

from django.db.models import Q #引入
Student.objects.filter(Q(name='xiao ming')|Q(age=12))

在Q對(duì)象里同樣可以使用條件限制參數(shù),也可以傳遞多個(gè)參數(shù)限制

聚合函數(shù)

QuerySet通過aggregate這個(gè)函數(shù)來實(shí)現(xiàn)聚合功能粘姜。

使用前需先導(dǎo)入聚合類:
from django.db.models import Sum,Count,Max,Min,Avg
例:查詢所有學(xué)生的數(shù)目鬓照。select count(*) from student;
Student.objects.aggregate(Count('id'))
{'id__count': 5} 注意返回值類型及鍵名
例:查詢所有學(xué)生年齡和。
Student.objects.aggregate(Sum(‘a(chǎn)ge’))
{‘a(chǎn)ge__sum’:120}  注意返回值類型及鍵名

字段排序

QuerySet 通過order_by來對(duì)字段進(jìn)行排序

對(duì)年齡從小到大進(jìn)行排序
Student.objects.all().order_by('age')
對(duì)年齡從大到小進(jìn)行排序
Student.objects.all().order_by('-age')

自定義查詢語句

通過以上組合幾乎已經(jīng)可以實(shí)現(xiàn)所有數(shù)據(jù)庫(kù)查詢方式孤紧,當(dāng)然Django為了能夠?qū)崿F(xiàn)更靈活的查詢方式豺裆,還可以使用SQL語句直接進(jìn)行查詢。我們可以通過Django的connection對(duì)象直接執(zhí)行SQL語句

cursor = connection.cursor()
sql='''select name,age from student
    '''
cursor.execute(sql)
fetchall=cursor.fetchall()
students=[]
for object in fetchall:
    students.append({'name':object[0],'age':object[1]})

我們通過connection獲取游標(biāo),然后通過游標(biāo)執(zhí)行SQL語句臭猜,通過fetchall函數(shù)返回查詢結(jié)果躺酒,注意返回結(jié)果為一個(gè)集合,里面每個(gè)元素為一個(gè)數(shù)組蔑歌,以select 后面字段順序返回
我們可以使用同樣方法對(duì)數(shù)據(jù)進(jìn)行增加修改刪除操作羹应,不過與查詢有點(diǎn)不同的是需要transaction進(jìn)行提交修改

cursor = connection.cursor()
sql='''update student set age=13 where name='xiao ming'
    '''
cursor.execute(sql)
transaction.commit_unless_managed()

結(jié)語

學(xué)習(xí)到現(xiàn)在,我們已經(jīng)了解了Django web開發(fā)過程中基本知識(shí)次屠,大家現(xiàn)在可以利用Django自己簡(jiǎn)單的搭建一個(gè)小型的web系統(tǒng)园匹,接下來將會(huì)結(jié)合具體的小項(xiàng)目來向大家講解Django開發(fā)中常見的一些問題以及一些高級(jí)技術(shù),敬請(qǐng)期待劫灶。

最近參加支付寶小程序比賽需要訪問量裸违,麻煩各位看官有空復(fù)制下面的話打開支付寶,搜索欄粘貼本昏,在此多謝各位支持了

#JvCmawp74I1#長(zhǎng)按復(fù)制此消息供汛,打開支付寶搜索,體驗(yàn)?zāi)暇┮咔榈貓D小程序
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凛俱,一起剝皮案震驚了整個(gè)濱河市紊馏,隨后出現(xiàn)的幾起案子料饥,更是在濱河造成了極大的恐慌蒲犬,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸啡,死亡現(xiàn)場(chǎng)離奇詭異原叮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巡蘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門奋隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悦荒,你說我怎么就攤上這事唯欣。” “怎么了搬味?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵境氢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我碰纬,道長(zhǎng)萍聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任悦析,我火速辦了婚禮寿桨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘强戴。我一直安慰自己亭螟,他們只是感情好挡鞍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著预烙,像睡著了一般匕累。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上默伍,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天欢嘿,我揣著相機(jī)與錄音,去河邊找鬼也糊。 笑死炼蹦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狸剃。 我是一名探鬼主播掐隐,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼钞馁!你這毒婦竟也來了虑省?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤僧凰,失蹤者是張志新(化名)和其女友劉穎探颈,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體训措,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伪节,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绩鸣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怀大。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呀闻,靈堂內(nèi)的尸體忽然破棺而出化借,到底是詐尸還是另有隱情,我是刑警寧澤捡多,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布蓖康,位于F島的核電站,受9級(jí)特大地震影響局服,放射性物質(zhì)發(fā)生泄漏钓瞭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一淫奔、第九天 我趴在偏房一處隱蔽的房頂上張望山涡。 院中可真熱鬧,春花似錦、人聲如沸鸭丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞溉。三九已至瘾带,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熟菲,已是汗流浹背看政。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抄罕,地道東北人允蚣。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像呆贿,于是被迫代替她去往敵國(guó)和親嚷兔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容