(2018-05-11.Python從Zero到One)6斗锭、(Django)Django模型__1.2.3模型查詢

上一篇文章為:→1.2.2類的屬性

簡介

  • 查詢集表示從數(shù)據(jù)庫中獲取的對象集合
  • 查詢集可以含有零個由桌、一個或多個過濾器
  • 過濾器基于所給的參數(shù)限制查詢的結(jié)果
  • 從Sql的角度,查詢集和select語句等價帆谍,過濾器像where和limit子句
  • 接下來主要討論如下知識點
    • 查詢集
    • 字段查詢:比較運算符伪朽,F(xiàn)對象,Q對象

查詢集

  • 在管理器上調(diào)用過濾器方法會返回查詢集
  • 查詢集經(jīng)過過濾器篩選后返回新的查詢集汛蝙,因此可以寫成鏈式過濾
  • 惰性執(zhí)行:創(chuàng)建查詢集不會帶來任何數(shù)據(jù)庫的訪問烈涮,直到調(diào)用數(shù)據(jù)時,才會訪問數(shù)據(jù)庫
  • 何時對查詢集求值:迭代窖剑,序列化坚洽,與if合用
  • 返回查詢集的方法,稱為過濾器
    • all()
    • filter()
    • exclude()
    • order_by()
    • values():一個對象構(gòu)成一個字典西土,然后構(gòu)成一個列表返回
  • 寫法:
filter(鍵1=值1,鍵2=值2)
等價于
filter(鍵1=值1).filter(鍵2=值2)
  • 返回單個值的方法
    • get():返回單個滿足條件的對象
      • 如果未找到會引發(fā)"模型類.DoesNotExist"異常
      • 如果多條被返回讶舰,會引發(fā)"模型類.MultipleObjectsReturned"異常
    • count():返回當前查詢的總條數(shù)
    • first():返回第一個對象
    • last():返回最后一個對象
    • exists():判斷查詢集中是否有數(shù)據(jù),如果有則返回True

限制查詢集

  • 查詢集返回列表需了,可以使用下標的方式進行限制跳昼,等同于sql中的limit和offset子句
  • 注意:不支持負數(shù)索引
  • 使用下標后返回一個新的查詢集,不會立即執(zhí)行查詢
  • 如果獲取一個對象肋乍,直接使用[0]鹅颊,等同于[0:1].get(),但是如果沒有數(shù)據(jù)住拭,[0]引發(fā)IndexError異常挪略,[0:1].get()引發(fā)DoesNotExist異常

查詢集的緩存

  • 每個查詢集都包含一個緩存來最小化對數(shù)據(jù)庫的訪問
  • 在新建的查詢集中历帚,緩存為空滔岳,首次對查詢集求值時,會發(fā)生數(shù)據(jù)庫查詢挽牢,django會將查詢的結(jié)果存在查詢集的緩存中谱煤,并返回請求的結(jié)果,接下來對查詢集求值將重用緩存的結(jié)果
  • 情況一:這構(gòu)成了兩個查詢集禽拔,無法重用緩存刘离,每次查詢都會與數(shù)據(jù)庫進行一次交互,增加了數(shù)據(jù)庫的負載
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
  • 情況二:兩次循環(huán)使用同一個查詢集睹栖,第二次使用緩存中的數(shù)據(jù)
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
  • 何時查詢集不會被緩存:當只對查詢集的部分進行求值時會檢查緩存硫惕,但是如果這部分不在緩存中,那么接下來查詢返回的記錄將不會被緩存野来,這意味著使用索引來限制查詢集將不會填充緩存恼除,如果這部分數(shù)據(jù)已經(jīng)被緩存,則直接使用緩存中的數(shù)據(jù)

字段查詢

  • 實現(xiàn)where子名,作為方法filter()豁辉、exclude()令野、get()的參數(shù)
  • 語法:屬性名稱__比較運算符=值
  • 表示兩個下劃線,左側(cè)是屬性名稱徽级,右側(cè)是比較類型
  • 對于外鍵气破,使用“屬性名_id”表示外鍵的原始值
  • 轉(zhuǎn)義:like語句中使用了%與,匹配數(shù)據(jù)中的%與餐抢,在過濾器中直接寫现使,例如:filter(title__contains="%")=>where title like '%%%',表示查找標題中包含%的
比較運算符
  • exact:表示判等弹澎,大小寫敏感朴下;如果沒有寫“ 比較運算符”,表示判等
filter(isDelete=False)
  • contains:是否包含苦蒿,大小寫敏感
exclude(btitle__contains='傳')
  • startswith殴胧、endswith:以value開頭或結(jié)尾,大小寫敏感
exclude(btitle__endswith='傳')
  • isnull佩迟、isnotnull:是否為null
filter(btitle__isnull=False)
  • 在前面加個i表示不區(qū)分大小寫团滥,如iexact、icontains报强、istarswith灸姊、iendswith
  • in:是否包含在范圍內(nèi)
filter(pk__in=[1, 2, 3, 4, 5])
  • gt、gte秉溉、lt力惯、lte:大于、大于等于召嘶、小于父晶、小于等于
filter(id__gt=3)
  • year、month弄跌、day甲喝、week_day、hour铛只、minute埠胖、second:對日期間類型的屬性進行運算
filter(bpub_date__year=1980)
filter(bpub_date__gt=date(1980, 12, 31))
  • 跨關(guān)聯(lián)關(guān)系的查詢:處理join查詢
    • 語法:模型類名 <屬性名> <比較>
    • 注:可以沒有__<比較>部分,表示等于淳玩,結(jié)果同inner join
    • 可返向使用直撤,即在關(guān)聯(lián)的兩個模型中都可以使用
filter(heroinfo_ _hcontent_ _contains='八')
  • 查詢的快捷方式:pk,pk表示primary key蜕着,默認的主鍵是id
filter(pk__lt=6)

聚合函數(shù)

  • 使用aggregate()函數(shù)返回聚合函數(shù)的值
  • 函數(shù):Avg谋竖,Count,Max,Min圈盔,Sum
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
  • count的一般用法:
count = list.count()

F對象

  • 可以使用模型的字段A與字段B進行比較豹芯,如果A寫在了等號的左邊,則B出現(xiàn)在等號的右邊驱敲,需要通過F對象構(gòu)造
list.filter(bread__gte=F('bcommet'))
  • django支持對F()對象使用算數(shù)運算
list.filter(bread__gte=F('bcommet') * 2)
  • F()對象中還可以寫作“模型類__列名”進行關(guān)聯(lián)查詢
list.filter(isDelete=F('heroinfo__isDelete'))
  • 對于date/time字段铁蹈,可與timedelta()進行運算
list.filter(bpub_date__lt=F('bpub_date') + timedelta(days=1))

Q對象

  • 過濾器的方法中關(guān)鍵字參數(shù)查詢,會合并為And進行
  • 需要進行or查詢众眨,使用Q()對象
  • Q對象(django.db.models.Q)用于封裝一組關(guān)鍵字參數(shù)握牧,這些關(guān)鍵字參數(shù)與“比較運算符”中的相同
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
  • Q對象可以使用&(and)、|(or)操作符組合起來
  • 當操作符應(yīng)用在兩個Q對象時娩梨,會產(chǎn)生一個新的Q對象
list.filter(pk_ _lt=6).filter(bcommet_ _gt=10)
list.filter(Q(pk_ _lt=6) | Q(bcommet_ _gt=10))
  • 使用~(not)操作符在Q對象前表示取反
list.filter(~Q(pk__lt=6))
  • 可以使用&|~結(jié)合括號進行分組沿腰,構(gòu)造做生意復雜的Q對象
  • 過濾器函數(shù)可以傳遞一個或多個Q對象作為位置參數(shù),如果有多個Q對象狈定,這些參數(shù)的邏輯為and
  • 過濾器函數(shù)可以混合使用Q對象和關(guān)鍵字參數(shù)颂龙,所有參數(shù)都將and在一起,Q對象必須位于關(guān)鍵字參數(shù)的前面

下一篇文章為:→1.2.4自連接
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纽什,一起剝皮案震驚了整個濱河市措嵌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦缰,老刑警劉巖企巢,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異让蕾,居然都是意外死亡浪规,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門探孝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笋婿,“玉大人,你說我怎么就攤上這事再姑∶鹊郑” “怎么了找御?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵元镀,是天一觀的道長。 經(jīng)常有香客問我霎桅,道長栖疑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任滔驶,我火速辦了婚禮遇革,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己萝快,他們只是感情好锻霎,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揪漩,像睡著了一般旋恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奄容,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天冰更,我揣著相機與錄音,去河邊找鬼昂勒。 笑死蜀细,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的戈盈。 我是一名探鬼主播奠衔,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塘娶!你這毒婦竟也來了涣觉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤血柳,失蹤者是張志新(化名)和其女友劉穎官册,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體难捌,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡膝宁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了根吁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片员淫。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖击敌,靈堂內(nèi)的尸體忽然破棺而出介返,到底是詐尸還是另有隱情,我是刑警寧澤沃斤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布圣蝎,位于F島的核電站,受9級特大地震影響衡瓶,放射性物質(zhì)發(fā)生泄漏徘公。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一哮针、第九天 我趴在偏房一處隱蔽的房頂上張望关面。 院中可真熱鬧坦袍,春花似錦、人聲如沸等太。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缩抡。三九已至辛燥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缝其,已是汗流浹背挎塌。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留内边,地道東北人榴都。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像漠其,于是被迫代替她去往敵國和親嘴高。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理和屎,服務(wù)發(fā)現(xiàn)拴驮,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • Django 1.8.2 文檔Home | Table of contents | Index | Modules...
    軒轅小愛閱讀 2,344評論 0 2
  • Django 文檔協(xié)作翻譯小組人手緊缺柴信,有興趣的朋友可以加入我們套啤,完全公益性質(zhì)。交流群:467338606網(wǎng)站:h...
    布客飛龍閱讀 891評論 0 41
  • 查詢集表示從數(shù)據(jù)庫中獲取的對象集合 查詢集可以含有零個随常、一個或多個過濾器 過濾器基于所給的參數(shù)限制查詢的結(jié)果 從S...
    _琳哥閱讀 859評論 0 1
  • 五月绪氛,潔白的花事持續(xù)撫肩 滌蕩心肺 丟開整日埋首的軍令如山 斜坐一邊 眼飽友人北方的槐花宴 終揚起嘴角的蜜意難入眠...
    圓善閱讀 446評論 7 14