Pycharm開發(fā)Django項(xiàng)目創(chuàng)建ORM模型的問題
隨著項(xiàng)目越來(lái)越大,采用寫原生SQL的方式在代碼中會(huì)出現(xiàn)大量的SQL語(yǔ)句,那么問題就出現(xiàn)了:
- SQL語(yǔ)句重復(fù)利用率不高,越復(fù)雜的SQL語(yǔ)句條件越多,代碼越長(zhǎng)。會(huì)出現(xiàn)很多相近的SQL語(yǔ)句。
- 很多SQL語(yǔ)句是在業(yè)務(wù)邏輯中拼出來(lái)的,如果有數(shù)據(jù)庫(kù)需要更改,就要去修改這些邏輯,這會(huì)很容易漏掉對(duì)某些SQL語(yǔ)句的修改。
- 寫SQL時(shí)容易忽略web安全問題,給未來(lái)造成隱患。SQL注入。
ORM
,全稱Object Relational Mapping
,中文叫做對(duì)象關(guān)系映射,通過ORM
我們可以通過類的方式去操作數(shù)據(jù)庫(kù),而不用再寫原生的SQL語(yǔ)句。通過把表映射成類,把行作實(shí)例,把字段作為屬性,ORM
在執(zhí)行對(duì)象操作的時(shí)候最終還是會(huì)把對(duì)應(yīng)的操作轉(zhuǎn)換為數(shù)據(jù)庫(kù)原生語(yǔ)句。使用ORM
有許多優(yōu)點(diǎn):
- 易用性:使用
ORM
做數(shù)據(jù)庫(kù)的開發(fā)可以有效的減少重復(fù)SQL語(yǔ)句的概率,寫出來(lái)的模型也更加直觀、清晰。 - 性能損耗?。?code>ORM轉(zhuǎn)換成底層數(shù)據(jù)庫(kù)操作指令確實(shí)會(huì)有一些開銷。但從實(shí)際的情況來(lái)看,這種性能損耗很少(不足5%),只要不是對(duì)性能有嚴(yán)苛的要求,綜合考慮開發(fā)效率、代碼的閱讀性,帶來(lái)的好處要遠(yuǎn)遠(yuǎn)大于性能損耗,而且項(xiàng)目越大作用越明顯。
- 設(shè)計(jì)靈活:可以輕松的寫出復(fù)雜的查詢。
- 可移植性:
Django
封裝了底層的數(shù)據(jù)庫(kù)實(shí)現(xiàn),支持多個(gè)關(guān)系數(shù)據(jù)庫(kù)引擎,包括流行的MySQL
、PostgreSQL
和SQLite
??梢苑浅]p松的切換數(shù)據(jù)庫(kù)。
創(chuàng)建ORM模型:
ORM
模型一般都是放在app
的models.py
文件中。每個(gè)app
都可以擁有自己的模型。并且如果這個(gè)模型想要映射到數(shù)據(jù)庫(kù)中,那么這個(gè)app
必須要放在settings.py
的INSTALLED_APP
中進(jìn)行安裝。以下是寫一個(gè)簡(jiǎn)單的書籍ORM
模型。示例代碼如下:
from django.db import models class Book(models.Model): 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è)類。這個(gè)模型以后映射到數(shù)據(jù)庫(kù)中,表名是模型名稱的小寫形式,為book
。在這個(gè)表中,有四個(gè)字段,一個(gè)為name
,這個(gè)字段是保存的是書的名稱,是varchar
類型,最長(zhǎng)不能超過20個(gè)字符,并且不能為空。第二個(gè)字段是作者名字類型,同樣也是varchar
類型,長(zhǎng)度不能超過20個(gè)。第三個(gè)是出版時(shí)間,數(shù)據(jù)類型是datetime
類型,默認(rèn)是保存這本書籍的時(shí)間。第五個(gè)是這本書的價(jià)格,是浮點(diǎn)類型。
還有一個(gè)字段我們沒有寫,就是主鍵id
,在django
中,如果一個(gè)模型沒有定義主鍵,那么將會(huì)自動(dòng)生成一個(gè)自動(dòng)增長(zhǎng)的int
類型的主鍵,并且這個(gè)主鍵的名字就叫做id
。
映射模型到數(shù)據(jù)庫(kù)中:
將ORM
模型映射到數(shù)據(jù)庫(kù)中,總結(jié)起來(lái)就是以下幾步:
- 在
settings.py
中,配置好DATABASES
,做好數(shù)據(jù)庫(kù)相關(guān)的配置。 - 在
app
中的models.py
中定義好模型,這個(gè)模型必須繼承自django.db.models
。 - 將這個(gè)
app
添加到settings.py
的INSTALLED_APP
中。 - 在命令行終端,進(jìn)入到項(xiàng)目所在的路徑,然后執(zhí)行命令
python manage.py makemigrations
來(lái)生成遷移腳本文件。 - 同樣在命令行中,執(zhí)行命令
python manage.py migrate
來(lái)將遷移腳本文件映射到數(shù)據(jù)庫(kù)中。
到此這篇關(guān)于Pycharm開發(fā)Django項(xiàng)目ORM模型介紹的文章就介紹到這了,更多相關(guān)Pycharm開發(fā)Django項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python機(jī)器學(xué)習(xí)之KNN近鄰算法
KNN可以說(shuō)是最簡(jiǎn)單的分類算法之一,同時(shí),它也是最常用的分類算法,文中非常詳細(xì)的介紹了該算法,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05Python中的numpy數(shù)組維度擴(kuò)展詳解
這篇文章主要介紹了Python中的numpy數(shù)組維度擴(kuò)展詳解,在numpy數(shù)組中,切片功能非常常用,例如x[:]表示取x的所有元素,可以通過在切片中增加None或者np.newaxis實(shí)現(xiàn),它們的作用就是在相應(yīng)的位置上增加一個(gè)維度,在這個(gè)維度上只有一個(gè)元素,需要的朋友可以參考下2023-09-09使用Node.js和Socket.IO擴(kuò)展Django的實(shí)時(shí)處理功能
這篇文章主要介紹了使用Node.js和Socket.IO擴(kuò)展Django的實(shí)時(shí)處理功能,用異步處理實(shí)時(shí)功能是相當(dāng)強(qiáng)大的,文中給出的例子是建立一個(gè)實(shí)時(shí)聊天室,需要的朋友可以參考下2015-04-04Python PyQt5實(shí)戰(zhàn)項(xiàng)目之查詢器的實(shí)現(xiàn)流程詳解
PyQt5以一套Python模塊的形式來(lái)實(shí)現(xiàn)功能。它包含了超過620個(gè)類,600個(gè)方法和函數(shù)。它是一個(gè)多平臺(tái)的工具套件,它可以運(yùn)行在所有的主流操作系統(tǒng)中,包含Unix,Windows和Mac OS。PyQt5采用雙重許可模式。開發(fā)者可以在GPL和社區(qū)授權(quán)之間選擇2021-11-11對(duì)python自動(dòng)生成接口測(cè)試的示例講解
今天小編就為大家分享一篇對(duì)python自動(dòng)生成接口測(cè)試的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11python獲取當(dāng)前時(shí)間對(duì)應(yīng)unix時(shí)間戳的方法
這篇文章主要介紹了python獲取當(dāng)前時(shí)間對(duì)應(yīng)unix時(shí)間戳的方法,涉及Python時(shí)間操作的相關(guān)技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-05-05使用Streamlit和Pandas實(shí)現(xiàn)帶有可點(diǎn)擊鏈接的數(shù)據(jù)表格
這篇文章主要為大家詳細(xì)介紹了如何利用?Streamlit?和?Pandas?在?Python?中創(chuàng)建一個(gè)帶有可點(diǎn)擊鏈接的數(shù)據(jù)表格,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11python?包實(shí)現(xiàn)?time?時(shí)間管理操作
這篇文章主要介紹了python包實(shí)現(xiàn)time時(shí)間管理操作,文章通過獲取當(dāng)前時(shí)間戳,即當(dāng)前系統(tǒng)內(nèi)表示時(shí)間的一個(gè)浮點(diǎn)數(shù),下文更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-04-04Python利用networkx畫圖繪制Les?Misérables人物關(guān)系
這篇文章主要為大家介紹了Python利用networkx畫圖處理繪制Les?Misérables悲慘世界里的人物關(guān)系圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05