django學(xué)習(xí)筆記(二)—— M層相關(guān)學(xué)習(xí)

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包含.png
    url配置.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)算符
    1. 等于查詢:exact
    • list = BookInfo.objects.filter(id__exact=1)簡(jiǎn)寫(xiě)為:
    • list = BookInfo.objects.fileter(id=1)
    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

    1. 空查詢:isnull
    • list = BookInfo.objects.filter(btitle__isnull=False)
    1. 范圍查詢:in
    • list = BookInfo.objects.filter(id__in=[1, 2, 3])
    1. 比較查詢:gt, lt, gte, lte
    • list = BookInfo.objects.filter(id__gt=3)
    1. 不等于:exclude
    • list = BookInfo.objects.filter(id__exclude=3) # id不等于3的書(shū)
    1. 日期查詢: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='部')
  • 一對(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
  • 自關(guān)聯(lián)
自關(guān)聯(lián)模型類定義.png
視圖.png
URL.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ǔ)法為:

自定義模型類管理器.png
自定義后打開(kāi)shell執(zhí)行book = BookInfo.objects.get(id=1)時(shí)報(bào)錯(cuò):
Snip20190703_114.png
自定義管理器主要有兩種使用方法:

  • 重寫(xiě)all方法
  • 向管理器中添加額外的方法肌幽,比如添加數(shù)據(jù)方法
  1. 重寫(xiě)all方法:
    自定義管理器.png
    模型類中使用自自定義管理器.png
  2. 在管理器中定義創(chuàng)建對(duì)象的方法:
    自定義方法.png
    調(diào)用自定義方法:book = 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類.png
Meta類修改表名.png

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廊移,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子探入,更是在濱河造成了極大的恐慌狡孔,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜂嗽,死亡現(xiàn)場(chǎng)離奇詭異苗膝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)植旧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門辱揭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)离唐,“玉大人,你說(shuō)我怎么就攤上這事问窃『蓿” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵泡躯,是天一觀的道長(zhǎng)贮竟。 經(jīng)常有香客問(wèn)我丽焊,道長(zhǎng)较剃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任技健,我火速辦了婚禮写穴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雌贱。我一直安慰自己啊送,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布欣孤。 她就那樣靜靜地躺著馋没,像睡著了一般。 火紅的嫁衣襯著肌膚如雪降传。 梳的紋絲不亂的頭發(fā)上篷朵,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音婆排,去河邊找鬼声旺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛段只,可吹牛的內(nèi)容都是我干的腮猖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼赞枕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼澈缺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起炕婶,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谍椅,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后古话,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體雏吭,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年陪踩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杖们。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悉抵。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摘完,靈堂內(nèi)的尸體忽然破棺而出姥饰,到底是詐尸還是另有隱情,我是刑警寧澤孝治,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布列粪,位于F島的核電站,受9級(jí)特大地震影響谈飒,放射性物質(zhì)發(fā)生泄漏岂座。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一杭措、第九天 我趴在偏房一處隱蔽的房頂上張望费什。 院中可真熱鬧,春花似錦手素、人聲如沸鸳址。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稿黍。三九已至,卻和暖如春崩哩,著一層夾襖步出監(jiān)牢的瞬間巡球,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工琢锋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辕漂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓吴超,卻偏偏與公主長(zhǎng)得像钉嘹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲸阻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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