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小程序