Django學習筆記:Models04 數(shù)據(jù)庫查詢

創(chuàng)建對象

①<表>.objects.create(<字段1>=’xxx’, <字段2>=’xxx’, ...)

②<變量> = <表>(<字段1>=’xxx’, <字段2>=’xxx’, ...)

??<變量>.save()

③<變量> = <表>()

??<變量>.<字段> = ’xxx’

??<變量>.save()

④<表>.objects.get_or_create(<字段1> = ’xxx’, <字段2> = ’xxx’, ...)

#返回一個元組(object, True/False),新建對象返回True相艇,獲取對象返回False竭讳。速度較慢。



查詢對象

<表>.objects.all()

獲取所有對象的集合涧衙。

<表>.objects.all()[:10]

切片獲取前10條對象的集合,不支持負數(shù)切片。如果沒有匹配到對象清寇,會引發(fā)IndexError異常浩村。

<表>.objects.all().reverse()[:3]

倒序獲取后3條對象的集合做葵。


<表>.objects.filter(<字段>=’xxx’)

獲取所有匹配對象的集合形式,不存在則返回空集合心墅,不報錯酿矢。

獲取單條數(shù)據(jù)用<表>.objects.filter(<字段>=’xxx’)[0]


<表>.objects.exclude(<字段>=’xxx’, <字段2>=’xxx’, ...)

獲取除去匹配對象的所有對象集合榨乎。


<表>.objects.get(<字段>=’xxx’)

獲取單條匹配的對象,如果沒有匹配到瘫筐,會引發(fā)DoesNotExist異常蜜暑,如果匹配結(jié)果超過一個,

會引發(fā)MultipleObjectsReturned異常策肝。慎用.get()肛捍。


字段查詢的參數(shù):用于filter(), exclude(),和get()

__iexact:完全匹配(忽略大小寫)

__contains:包含匹配(__icontains忽略大小寫)

__startswith:從開頭位置匹配(__istartswith忽略大小寫)

__endswith:從結(jié)尾位置匹配(__iendswith忽略大小寫)

__gt:大于匹配(__gte大于等于)

__lt:小于匹配(__lte小于等于)

__in:列表內(nèi)的匹配,可以=<列表>之众,也可以=<QuerySet對象>

__range:范圍匹配篇梭,如date__range=(a, b),包含于a, b之中

__date:日期匹配(年酝枢,月恬偷,日),如=datetime.date(2010, 2, 2)

__year:年份匹配帘睦,如=2010

__quarter:季度匹配(1-4)

__month:月份匹配袍患,如=12(1-12)

__week:周數(shù)匹配,如=52/53(1-52/53)

__week_day:周幾的匹配竣付,如=7诡延,將周日設為1

__day:天數(shù)的匹配,如=31

__time:時間匹配古胆,如=datetime.time(xxx)

__hour:小時匹配肆良,如=23(0-23)

__minute:分鐘匹配,如=59(0-59)

__second:秒數(shù)匹配逸绎,如=59(0-59)

__isnull:匹配空值惹恃,如=True/False

__regex:正則表達式匹配(__iregex忽略大小寫),如=r’^/d’


<表>.objects.order_by(’<字段>’)

獲取所有匹配的對象并升序排列棺牧,<-字段>是降序排列巫糙。


<表>.objects.filter(<字段1>=’xxx’).order_by(’<字段2>’)

獲取匹配[字段1]的對象集合并按照[字段2]升序排列

<表>.objects.filter(<字段1>__contains=’xxx’).exclude(<字段2>=’xxxx’)

獲取[字段1]包含xxx而排除[字段2]為xxxx的對象


get_object_or_404(<表>, <參數(shù)>)

獲取對象,不存在則返回404錯誤


get_list_or_404(<表>, <參數(shù)>)

獲取對象的列表颊乘,列表為空則返回404錯誤


查詢是否有對象:<表>.objects.all().exists()

查詢對象的數(shù)量:<表>.objects.count()



F對象

將模型內(nèi)的一個字段與另一個字段比較参淹,F(xiàn)對象支持加、減乏悄、乘浙值、除、取模和冪運算操作檩小。


from django.db.models import F

<表>.objects.filter(<字段1>__<查詢參數(shù)>=F(‘<字段2>’) )

#用查詢參數(shù)比較[字段1]和[字段2]


<表>.objects.filter(<字段1>__<查詢參數(shù)>=F(‘<字段2>’) * 3)

#用查詢參數(shù)比較[字段1]和3倍的[字段2]


<表>.objects.filter(<字段1>__<查詢參數(shù)>=F(‘<字段2>’) + F(‘<字段3>’) )

#用查詢參數(shù)比較[字段1]和[字段2开呐、字段3的和]


對于date和date/time字段,還可以加減一個timedelta對象。

from datetime import timedelta

Entry.objects.filter(mod_date__gt=F('pub_date') + timedelta(days=3)?)

#發(fā)布3天后又進行修改的對象



Q對象

Q對象可封裝查詢集合负蚊,用于filter()神妹,exclude()颓哮,get()等函數(shù)家妆,Q對象要放在普通對象前面。

from django.db.models import Q

Q(<字段>__<查詢參數(shù)>=’xxx’)


可用&(and)冕茅、|(or)伤极、~(not)來組合Q對象,返回一個新的Q對象姨伤,如:

Poll.objects.filter(

Q(pub_date__year=2004) | ~Q(pub_date=date(2004, 7, 3)), question__startswith=’Who’)

#逗號分隔也表示邏輯“與”



復制對象

方法:創(chuàng)建一個實例對象并拷貝其所有的字段哨坪。

a = A(<字段1>=’xxx’, <字段2>=’xxx’, ...)

a.save() ??????#保存為pk=1的對象

a.pk = None ??#創(chuàng)建一份新的copy

a.save() ??????#保存為另一個pk=2的對象

多對多、一對一對象的復制乍楚?



更新和刪除對象

更新普通對象:

<對象>.update(<字段>=’xxx’)

可用F對象對模型中的字段本身進行全部更新当编,注意F對象不能跨表操作,如:

<表>.objects.all().update(<字段>=F(‘<字段>’) + 1)


刪除對象:

<對象>.delete()

如果該對象是主對象徒溪,默認同時刪除關聯(lián)的外鍵對象



QuerySet的緩存

新建的QuerySet的緩存是空的忿偷,當QuerySet第一次被提交后,數(shù)據(jù)庫執(zhí)行實際查詢操作臊泌,Django會把查詢結(jié)果保存在緩存內(nèi)鲤桥,隨后的對于該QuerySet的提交將重用這個緩存。緩存可以高效的利用查詢結(jié)果渠概,并降低數(shù)據(jù)庫負載茶凳。下面兩個例子:

print([e.headline for e in Entry.objects.all()])?????#方法一,2次實際查詢播揪,加倍數(shù)據(jù)庫的負載

print([e.pub_date for e in Entry.objects.all()])

queryset = Entry.objects.all()?????????????????#方法二贮喧,1次實際查詢

print([p.headline for p in queryset]) ????????????#?提交查詢

print([p.pub_date for p in queryset]) ???????????#?重用緩存


對QuerySet建立緩存的操作:

[entry for entry in queryset]????#迭代

<表>.objacts.all()[:10:2] ???????#指定步長的切片(普通切片不查詢)

bool(queryset)???????????????#測試布爾值

entry in queryset

list(queryset)??????????????????#列表轉(zhuǎn)換


多對一關系創(chuàng)建緩存:

f = <外鍵表>.objects.select_related()

此時用f.<外鍵列>引用主對象,使用的就是緩存




ForeignKey的處理方法:

add(obj1, obj2, ...):添加指定的模型對象到關聯(lián)的對象集中

create(**kwargs):創(chuàng)建一個新的對象猪狈,將它保存并放在關聯(lián)的對象集中塞淹,返回新創(chuàng)建的對象

remove(obj1, obj2, ...):從關聯(lián)的對象集中刪除指定的模型對象

clear():清空關聯(lián)的對象集

set(objs):重置關聯(lián)的對象集

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罪裹,隨后出現(xiàn)的幾起案子饱普,更是在濱河造成了極大的恐慌,老刑警劉巖状共,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件套耕,死亡現(xiàn)場離奇詭異,居然都是意外死亡峡继,警方通過查閱死者的電腦和手機冯袍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人康愤,你說我怎么就攤上這事儡循。” “怎么了征冷?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵择膝,是天一觀的道長。 經(jīng)常有香客問我检激,道長肴捉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任叔收,我火速辦了婚禮齿穗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饺律。我一直安慰自己窃页,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布复濒。 她就那樣靜靜地躺著脖卖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芝薇。 梳的紋絲不亂的頭發(fā)上胚嘲,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音洛二,去河邊找鬼馋劈。 笑死,一個胖子當著我的面吹牛晾嘶,可吹牛的內(nèi)容都是我干的妓雾。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼垒迂,長吁一口氣:“原來是場噩夢啊……” “哼械姻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起机断,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤楷拳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吏奸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欢揖,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年奋蔚,在試婚紗的時候發(fā)現(xiàn)自己被綠了她混。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烈钞。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坤按,靈堂內(nèi)的尸體忽然破棺而出毯欣,到底是詐尸還是另有隱情,我是刑警寧澤臭脓,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布酗钞,位于F島的核電站,受9級特大地震影響谢鹊,放射性物質(zhì)發(fā)生泄漏砂轻。R本人自食惡果不足惜睦优,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望微王。 院中可真熱鬧蔼夜,春花似錦兼耀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至匠题,卻和暖如春拯坟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背韭山。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工郁季, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钱磅。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓梦裂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盖淡。 傳聞我的和親對象是個殘疾皇子年柠,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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