創(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)的對象集