Django學(xué)習(xí)-第六講(下):django數(shù)據(jù)庫(kù)的ORM操作方法及常用字段

1.ORM模型介紹

隨著項(xiàng)目越來(lái)越大祭衩,采用寫(xiě)原生SQL的方式在代碼中會(huì)出現(xiàn)大量的SQL語(yǔ)句所坯,那么問(wèn)題就出現(xiàn)了:

1.SQL語(yǔ)句重復(fù)利用率不高晒骇,越復(fù)雜的SQL語(yǔ)句條件越多纳胧,代碼越長(zhǎng)镰吆。會(huì)出現(xiàn)很多相近的SQL語(yǔ)句。

2.很多SQL語(yǔ)句是在業(yè)務(wù)邏輯中拼出來(lái)的跑慕,如果有數(shù)據(jù)庫(kù)需要更改万皿,就要去修改這些邏輯,這會(huì)很容易漏掉對(duì)某些SQL語(yǔ)句的修改。

3.寫(xiě)SQL時(shí)容易忽略web安全問(wèn)題相寇,給未來(lái)造成隱患慰于。SQL注入。

select * from user where username = 'zjk'#' and  password = ''

select * from user where username = 'zjk'-- ' and  password = ''

select * from sqldb_book where id = -1 or 1=1

1.1 ORM

全稱(chēng)Object Relational Mapping唤衫,中文叫做對(duì)象關(guān)系映射婆赠,通過(guò)ORM我們可以通過(guò)類(lèi)的方式去操作數(shù)據(jù)庫(kù),而不用再寫(xiě)原生的SQL語(yǔ)句佳励。通過(guò)把表映射成類(lèi)休里,把行作實(shí)例,把字段作為屬性赃承,ORM在執(zhí)行對(duì)象操作的時(shí)候最終還是會(huì)把對(duì)應(yīng)的操作轉(zhuǎn)換為數(shù)據(jù)庫(kù)原生語(yǔ)句妙黍。

from django.db import models
# 創(chuàng)建一個(gè)模型,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的一張表
class Book(models.Model):
    id = models.AutoField()
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    price = models.FloatField()

# 一個(gè)模型的對(duì)象,對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的一條數(shù)據(jù)
book = Book(name="Python",author='龜叔',price=89)
# save方法,保存
book.save()
# delete方法,刪除
book.delete()

1.2 使用ORM的優(yōu)點(diǎn)

  • 1.易用性:使用ORM做數(shù)據(jù)庫(kù)的開(kāi)發(fā)可以有效的減少重復(fù)SQL語(yǔ)句的概率瞧剖,寫(xiě)出來(lái)的模型也更加直觀(guān)拭嫁、清晰。

  • 2.性能損耗凶ビ凇:ORM轉(zhuǎn)換成底層數(shù)據(jù)庫(kù)操作指令確實(shí)會(huì)有一些開(kāi)銷(xiāo)做粤。但從實(shí)際的情況來(lái)看,這種性能損耗很少(不足5%)捉撮,只要不是對(duì)性能有嚴(yán)苛的要求怕品,綜合考慮開(kāi)發(fā)效率、代碼的閱讀性巾遭,帶來(lái)的好處要遠(yuǎn)遠(yuǎn)大于性能損耗肉康,而且項(xiàng)目越大作用越明顯。

  • 3.設(shè)計(jì)靈活:可以輕松的寫(xiě)出復(fù)雜的查詢(xún)灼舍。

  • 4.可移植性:Django封裝了底層的數(shù)據(jù)庫(kù)實(shí)現(xiàn)吼和,支持多個(gè)關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的MySQL骑素、PostgreSQL和SQLite炫乓。可以非常輕松的切換數(shù)據(jù)庫(kù)砂豌。

2. 創(chuàng)建ORM模型

ORM模型一般都是放在app的models.py文件中厢岂。每個(gè)app都可以擁有自己的模型光督。并且如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中阳距,那么這個(gè)app必須要放在settings.pyINSTALLED_APP中進(jìn)行安裝。以下是寫(xiě)一個(gè)簡(jiǎn)單的書(shū)籍ORM模型结借。

from django.db import models
class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20,null=False)
    author = models.CharField(max_length=20,null=False)
    pub_time = models.DateTimeField(default=datetime.now)
    price = models.FloatField(default=0)

以上便定義了一個(gè)模型筐摘。這個(gè)模型繼承自django.db.models.Model,如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中,就必須繼承自這個(gè)類(lèi)咖熟。這個(gè)模型以后映射到數(shù)據(jù)庫(kù)中圃酵,表名是模型名稱(chēng)的小寫(xiě)形式,為book馍管。在這個(gè)表中郭赐,有四個(gè)字段,一個(gè)為name确沸,這個(gè)字段是保存的是書(shū)的名稱(chēng)捌锭,是varchar類(lèi)型,最長(zhǎng)不能超過(guò)20個(gè)字符罗捎,并且不能為空观谦。第二個(gè)字段是作者名字類(lèi)型,同樣也是varchar類(lèi)型桨菜,長(zhǎng)度不能超過(guò)20個(gè)豁状。第三個(gè)是出版時(shí)間,數(shù)據(jù)類(lèi)型是datetime類(lèi)型倒得,默認(rèn)是保存這本書(shū)籍的時(shí)間泻红。第五個(gè)是這本書(shū)的價(jià)格,是浮點(diǎn)類(lèi)型屎暇。
還有一個(gè)字段我們沒(méi)有寫(xiě)承桥,就是主鍵id,在django中根悼,如果一個(gè)模型沒(méi)有定義主鍵凶异,那么將會(huì)自動(dòng)生成一個(gè)自動(dòng)增長(zhǎng)的int類(lèi)型的主鍵,并且這個(gè)主鍵的名字就叫做id挤巡。

3. 映射模型到數(shù)據(jù)庫(kù)中

將ORM模型映射到數(shù)據(jù)庫(kù)中剩彬,總結(jié)起來(lái)就是以下幾步:

1.在settings.py中,配置好DATABASES矿卑,做好數(shù)據(jù)庫(kù)相關(guān)的配置喉恋。

2.在app中的models.py中定義好模型,這個(gè)模型必須繼承自django.db.models母廷。
3.將這個(gè)app添加到settings.pyINSTALLED_APP中轻黑。

4.在命令行終端,進(jìn)入到項(xiàng)目所在的路徑琴昆,然后執(zhí)行命令python [manage.py](http://manage.py/) makemigrations來(lái)生成遷移腳本文件氓鄙。

5.同樣在命令行中,執(zhí)行命令python [manage.py](http://manage.py/) migrate來(lái)將遷移腳本文件映射到數(shù)據(jù)庫(kù)中业舍。

4. ORM的增刪改查

4.1 添加數(shù)據(jù)

views.py
--------------------------------------------------------------------
from django.shortcuts import render

from django.db import connection
from .models import Book
from django.http import HttpResponse

def add_book(request):
    book = Book(name="Python",author="JR",price=78)
    book.save()
    return HttpResponse("書(shū)籍添加成功")

4.2 查詢(xún)數(shù)據(jù)

4.2.1.根據(jù)主鍵進(jìn)行查找

book = Book.objects.get(pk=1)
print(book)

4.2.2.根據(jù)其他條件來(lái)查找

book = Book.objects.filter(name="Python")  
print(book)

4.2.3.查詢(xún)所有

book = Book.objects.all()

4.3 刪除數(shù)據(jù)

book = Book.objects.get(pk=1)
book.delete()

4.4修改數(shù)據(jù)

book = Book.objects.get(pk=2)
book.price = 200
book.save()

注:刪除和修改都需要先將我們要操作的數(shù)據(jù)查詢(xún)出來(lái)之后再操作抖拦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末升酣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子态罪,更是在濱河造成了極大的恐慌噩茄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件复颈,死亡現(xiàn)場(chǎng)離奇詭異绩聘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耗啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)君纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人芹彬,你說(shuō)我怎么就攤上這事蓄髓。” “怎么了舒帮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵会喝,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我玩郊,道長(zhǎng)肢执,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任译红,我火速辦了婚禮预茄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侦厚。我一直安慰自己耻陕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布刨沦。 她就那樣靜靜地躺著诗宣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪想诅。 梳的紋絲不亂的頭發(fā)上召庞,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音来破,去河邊找鬼篮灼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徘禁,可吹牛的內(nèi)容都是我干的诅诱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼晌坤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逢艘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起骤菠,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤它改,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后商乎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體央拖,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鹉戚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鲜戒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抹凳,死狀恐怖遏餐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赢底,我是刑警寧澤失都,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站幸冻,受9級(jí)特大地震影響粹庞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洽损,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一庞溜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碑定,春花似錦流码、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至访娶,卻和暖如春商虐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崖疤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工秘车, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劫哼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓叮趴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親权烧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眯亦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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