1. M層
1.1 ORM簡(jiǎn)單介紹
ORM框架將對(duì)象的save(),update(),delete(),get()等方法生成所選數(shù)據(jù)庫(kù)對(duì)應(yīng)的增改刪查語(yǔ)句胳施,進(jìn)而實(shí)現(xiàn)數(shù)據(jù)模型與數(shù)據(jù)庫(kù)解藕述寡。
1.2 django配置mysql
- 在虛擬環(huán)境中創(chuàng)建新的項(xiàng)目
- 修改配置文件中數(shù)據(jù)庫(kù):
django配置mysql.png- 手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù):
create database test charset=utf8;
(或者連接工具創(chuàng)建)- 創(chuàng)建應(yīng)用booktest川梅,報(bào)錯(cuò):
django使用mysql報(bào)錯(cuò).png- 安裝pymysql模塊
pip install pymysql
- 在項(xiàng)目__ init __.py中添加:
django配置mysql.png- 隨后可成功創(chuàng)建app,將app注冊(cè)到項(xiàng)目中。
1.3 使用
- 創(chuàng)建模型:
定義模型.png- 遷移
- 查看表結(jié)構(gòu):
表結(jié)構(gòu).png
注意沪编,默認(rèn)值不在數(shù)據(jù)庫(kù)層面,而是在django創(chuàng)建對(duì)象時(shí)有效年扩。另外boolean類型的字段蚁廓,對(duì)應(yīng)表后類型為tinyint類型。
1.4 測(cè)試
- 添加測(cè)試時(shí)數(shù)據(jù)
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values ('射雕英雄傳','1980-5-1',12,34,0), ('天龍八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飛狐','1987-11-11',58,24,0);
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values ('郭靖',1,1,'降龍十八掌',0), ('黃蓉',0,1,'打狗棍法',0), ('黃藥師',1,1,'彈指神通',0), ('歐陽(yáng)鋒',1,1,'蛤蟆功',0), ('梅超風(fēng)',0,1,'九陰白骨爪',0), ('喬峰',1,2,'降龍十八掌',0), ('段譽(yù)',1,2,'六脈神劍',0), ('虛竹',1,2,'天山六陽(yáng)掌',0), ('王語(yǔ)嫣',0,2,'神仙姐姐',0), ('令狐沖',1,3,'獨(dú)孤九劍',0), ('任盈盈',0,3,'彈琴',0), ('岳不群',1,3,'華山劍法',0), ('東方不敗',0,3,'葵花寶典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若蘭',0,4,'黃衣',0), ('程靈素',0,4,'醫(yī)術(shù)',0), ('袁紫衣',0,4,'六合拳',0);
- 視圖:
定義視圖.png- url配置:
url包含.pngurl配置.png- 模板配置和定義:
模板配置模板定義.png- 結(jié)果:
頁(yè)面效果.png
1.5 屬性定義
- 格式:
屬性名=models.字段類型(選項(xiàng))
厨幻;- 未設(shè)置任何屬性為主鍵列是相嵌,django創(chuàng)建自動(dòng)增長(zhǎng)的主鍵列腿时,屬性名默認(rèn)是id;
- 屬性名不能有連續(xù)的下劃線饭宾,這由django的查詢方式?jīng)Q定批糟;
- 字段類型:
- AutoField:不指定時(shí)django默認(rèn)添加名稱為id的自增主鍵列,指定某屬性后不再自動(dòng)創(chuàng)建看铆;
- BooleanField:布爾類型徽鼎,值為True或者False;
- NullBooleanField:支持Null弹惦,True纬傲,F(xiàn)lase三種值;
- CharField(max_lenhth=字符長(zhǎng)度):字符串
- max_length:最大字符個(gè)數(shù)肤频;
- TextField:大文本字段叹括,一般超過(guò)4000字符時(shí)使用;
- IntegerField:整數(shù)宵荒;
- DecimalField(max_digits=None, decimal_places=None):十進(jìn)制浮點(diǎn)數(shù)
- max_digits:總位數(shù)
- decimal_places:小數(shù)位數(shù)
- FloatField:浮點(diǎn)數(shù)汁雷;
- DateField(auto_now=False, auto_now_add=False):日期
- auto_now:更新時(shí)間
- auto_now_add:創(chuàng)建時(shí)間,二者不能同時(shí)為True
- TimeField:時(shí)間报咳,參數(shù)同DateField侠讯;
- DateTimeField:日期時(shí)間,參數(shù)同DateField暑刃;
- FileField:上傳文件字段厢漩;
- ImageField:繼承于FileField,對(duì)上傳文件進(jìn)行校驗(yàn)岩臣,確保是有效的圖片溜嗜。
- 選項(xiàng):
- null:True表示允許為空,默認(rèn)False架谎;
- blank:True表示允許字段為空白炸宵,默認(rèn)為False;
- db_column:字段名稱谷扣,若為指定土全,則使用屬性名;
- db_index:True表示該列創(chuàng)建索引会涎,默認(rèn)為False裹匙;
- default:默認(rèn)值;
- primary_key:True表示該字段為主鍵字段末秃,一般作為AutoField的選項(xiàng)使用概页,默認(rèn)為False;
- unique:True表示該字段在表中為唯一值蛔溃,默認(rèn)False绰沥;
1.6 字段查詢
django查詢一般使用:filter(), get(), exclude()。語(yǔ)法為:
屬性名__比較運(yùn)算符=值
(雙下劃線)贺待。
1.6.1 條件運(yùn)算符
-
- 等于查詢:
exact
-
list = BookInfo.objects.filter(id__exact=1)
簡(jiǎn)寫(xiě)為: list = BookInfo.objects.fileter(id=1)
- 等于查詢:
-
- 模糊查詢:
contains
,startswith
,endswith
list = BookInfo.objects.filter(btitle__contains='西') # 要查詢‘%’也無(wú)需轉(zhuǎn)義
list = BookInfo.objexts.filter(btitle__endswith='記')
上面運(yùn)算符區(qū)分大小寫(xiě)徽曲,若不區(qū)分,用
iexact
,icontains
,istartswith
,iendswith
- 模糊查詢:
-
- 空查詢:
isnull
list = BookInfo.objects.filter(btitle__isnull=False)
- 空查詢:
-
- 范圍查詢:
in
list = BookInfo.objects.filter(id__in=[1, 2, 3])
- 范圍查詢:
-
- 比較查詢:
gt
,lt
,gte
,lte
list = BookInfo.objects.filter(id__gt=3)
- 比較查詢:
-
- 不等于:
exclude
list = BookInfo.objects.filter(id__exclude=3) # id不等于3的書(shū)
- 不等于:
-
- 日期查詢:
year
,month
,day
,week_day
,hour
,minute
,second
list = BookInfo.objects.filter(bpub_date__year=1980) # 查詢1980年發(fā)表的圖書(shū)
list = BookInfo.objects.filter(bpub_date__gt=date(1980, 1, 1)) # 1980.1.1后發(fā)表的圖書(shū)
- 日期查詢:
1.6.2 F對(duì)象
上述查詢?yōu)樽侄闻c常量值比較麸塞,兩個(gè)字段比較可以使用F對(duì)象秃臣。F對(duì)象支持算數(shù)運(yùn)算。
from django.db.models import F
list = BookInfo.objects.filter(bread__gt=F('bcomment')) # 查詢閱讀量大于評(píng)論量的圖書(shū)
list = BookInfo.objects.filter(bread__gt=F('bcomment')*2) # 查詢閱讀量大于2倍評(píng)論量的圖書(shū)
1.6.3 Q對(duì)象
多個(gè)過(guò)濾器逐個(gè)調(diào)用表示邏輯與關(guān)系哪工,也可以條件處使用逗號(hào)拼接奥此。如:
-
list = BookInfo.objects.filter(bread__gt=20, id__lt=10)
等價(jià)于: list = BookInfo.objects.filter(bread__gt=20).filter(id__lt=10)
要實(shí)現(xiàn)邏輯或,使用Q對(duì)象雁比。Q對(duì)象語(yǔ)法:
-
Q(屬性名__運(yùn)算符=值)
稚虎,多個(gè)Q對(duì)象使用&
表示與,使用|
表示或偎捎,Q對(duì)象前面使用~
表示非蠢终。 from django.db.models import Q
list = BookInfo.objects.filter(Q(bread__gt=20)) # 查詢閱讀量大于20的圖書(shū)
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=10))
list = BookInfo.objects.filter(~Q(pk=3)) # 查詢id不為3的圖書(shū)。pk為主鍵的別名茴她,即primary_key寻拂。
1.6.4 聚合函數(shù)
使用aggregate()過(guò)濾器調(diào)用聚合函數(shù),聚合函數(shù)包括
Avg
,Count
,Max
,Min
,Sum
丈牢,定義在django.db.models中祭钉。
from django.db.models import Sum
book_sum = BookInfo.object.aggregate(Sum('bread')) # 返回一個(gè)字典類型的對(duì)象,形式為:{'bread__sum': 126}
book_count = BookInfo.objects.aggregate(Count('id')) # 返回:{'id__count': 5}
- 可以簡(jiǎn)寫(xiě)為:
count_value = BookInfo.objects.count() # 但是此時(shí)返回的是一個(gè)數(shù)字
己沛。
1.7 查詢集
- 返回查詢集的過(guò)濾器有:
- all()
- filter()
- exclude()
- order_by()
- 返回單個(gè)值的過(guò)濾器有:
- get():
- 如果未找到慌核,報(bào)“模型類.DoesNotExist”異常;
- 如果找到多條申尼,報(bào)“模型類.MultipleObjectsReturned”異常遂铡;
- count():返回總條數(shù);
- aggregate():返回一個(gè)字典晶姊。
- 返回查詢集中是否有數(shù)據(jù):
- exist():True表示有數(shù)據(jù)扒接,F(xiàn)alse表示沒(méi)有數(shù)據(jù)。
- 注意们衙,django訪問(wèn)數(shù)據(jù)庫(kù)有一特性惰性執(zhí)行钾怔,即:創(chuàng)建查詢集并不會(huì)訪問(wèn)數(shù)據(jù)庫(kù),只有調(diào)用數(shù)據(jù)時(shí)蒙挑,才會(huì)訪問(wèn)數(shù)據(jù)庫(kù)宗侦。
- 限制查詢集:可以對(duì)查詢集進(jìn)行取下標(biāo)和切片操作,等同于mysql中l(wèi)imit使用忆蚀。對(duì)查詢集切片后返回一個(gè)新的查詢集矾利,但不會(huì)立即執(zhí)行查詢姑裂。使用:
list = BookInfo.objects.all()[0:2] # 獲取前兩項(xiàng)
- 如果獲取第一個(gè)對(duì)象,使用[0]男旗,等同于[0:1].get()舶斧,但如果沒(méi)有數(shù)據(jù),[0]引發(fā)IndexError異常察皇,[0:1].get()引發(fā)DoesNotExist異常茴厉。
- 惰性執(zhí)行驗(yàn)證:
- linux虛擬機(jī)下載anaconda和pycharm,創(chuàng)建bookmanager項(xiàng)目和booktest應(yīng)用什荣,創(chuàng)建BookInfo模型矾缓。打開(kāi)mysql操作日志:
修改ubuntumysql日志配置.png
在shell中執(zhí)行list = BookInfo.objects.all()
創(chuàng)建查詢集是并未訪問(wèn)數(shù)據(jù)庫(kù),而在執(zhí)行list[0]
時(shí)查詢:訪問(wèn)數(shù)據(jù)庫(kù)時(shí)機(jī).png
1.8 模型類關(guān)系
- ForeignKey:一對(duì)多稻爬,字段定義在多的一端嗜闻;
- ManyToManyField:多對(duì)多,字段定義在任意端桅锄;
- OneToOneField:一對(duì)一泞辐,字段定義在任意端;
- 自關(guān)聯(lián)竞滓;
- 一對(duì)多關(guān)系
- 一到多的訪問(wèn):
一對(duì)應(yīng)模型類對(duì)象.多對(duì)應(yīng)模型類名小寫(xiě)_set
b = BookInfo.objects.get(pk=1)
herolist = b.heroinfo_set.all()
- 多到一的訪問(wèn):
多對(duì)應(yīng)模型類對(duì)象.屬性名
hero = HeroInfo.objects.get(id=1)
book = hero.hbook
- 多獲取一對(duì)象ID:
多對(duì)應(yīng)模型類對(duì)象.屬性名_id
book_id = hero.hbook_id
- 多關(guān)聯(lián)查詢一:
多類名小寫(xiě)__多類屬性名__條件運(yùn)算符=值
booklist= BookInfo.objects.filter(bookinfo__bcomment__contains='八')
- 一關(guān)聯(lián)查詢多:
關(guān)聯(lián)屬性名__一類屬性名__條件運(yùn)算符=值
herolist = HeroInfo.objects.filter(hbook__btitle__contains='部')
- 一到多的訪問(wèn):
- 一對(duì)一關(guān)系
- 一對(duì)一關(guān)聯(lián)查詢返回的也是結(jié)果集
- 一對(duì)一中沒(méi)有
類名小寫(xiě)_set
屬性
- 多對(duì)多關(guān)系
-
多對(duì)多建立表后會(huì)自動(dòng)創(chuàng)建中間表多對(duì)多模型類.png多對(duì)多表.png多對(duì)多表結(jié)構(gòu).png
-
多對(duì)多建立表后會(huì)自動(dòng)創(chuàng)建中間表
- 自關(guān)聯(lián)
自關(guān)聯(lián)模型類定義.png視圖.pngURL.png省模板.png信息頁(yè)模板.png省頁(yè)面.png信息頁(yè)頁(yè)面.png
1.9 模型類管理器
模型類管理器是django和數(shù)據(jù)庫(kù)交互的接口咐吼,是model.Manager類型的對(duì)象。定義模型時(shí)如果沒(méi)有定義模型類管理器商佑,django自動(dòng)創(chuàng)建一個(gè)名為objects的管理器锯茄,如果有自定義,則不再自動(dòng)創(chuàng)建茶没。自定義管理器的語(yǔ)法為:
自定義后打開(kāi)shell執(zhí)行自定義模型類管理器.pngbook = BookInfo.objects.get(id=1)
時(shí)報(bào)錯(cuò):自定義管理器主要有兩種使用方法:Snip20190703_114.png
- 重寫(xiě)all方法
- 向管理器中添加額外的方法肌幽,比如添加數(shù)據(jù)方法
- 重寫(xiě)all方法:
自定義管理器.png模型類中使用自自定義管理器.png- 在管理器中定義創(chuàng)建對(duì)象的方法:
調(diào)用自定義方法:自定義方法.pngbook = BookInfo.bookmanager.create_book('水滸傳', date(1980, 1, 1))
。
2.0 元選項(xiàng)
在模型類中定義Meta抓半,用于設(shè)置元信息喂急,如設(shè)置db_table自定義表名。django創(chuàng)建表的默認(rèn)表名為
應(yīng)用名_模型名
笛求。定義Meta類.pngMeta類修改表名.png