Django - ORM使用記錄(一)

ORM簡介
  • ORM概念

    對象關(guān)系映射(Object Relational Mapping抽碌,簡稱ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)亮靴。

    簡單的說掀泳,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)未辆,將程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中蔽挠。

    ORM在業(yè)務(wù)邏輯層和數(shù)據(jù)庫層之間充當了橋梁的作用

  • ORM由來

    讓我們從O/R開始脖咐。字母O起源于"對象"(Object),而R則來自于"關(guān)系"(Relational)师崎。

    幾乎所有的軟件開發(fā)過程中都會涉及到對象和關(guān)系數(shù)據(jù)庫默终。在用戶層面和業(yè)務(wù)邏輯層面,我們是面向?qū)ο蟮摹.攲ο蟮男畔l(fā)生變化的時候齐蔽,我們就需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中两疚。

    按照之前的方式來進行開發(fā)就會出現(xiàn)程序員會在自己的業(yè)務(wù)邏輯代碼中夾雜很多SQL語句用來增加、讀取含滴、修改诱渤、刪除相關(guān)數(shù)據(jù),而這些代碼通常都是重復的谈况。

  • ORM的優(yōu)勢

    ORM解決的主要問題是對象和關(guān)系的映射勺美。它通常把一個類和一個表一一對應(yīng),類的每個實例對應(yīng)表中的一條記錄碑韵,類的每個屬性對應(yīng)表中的每個字段赡茸。

    ORM提供了對數(shù)據(jù)庫的映射,不用直接編寫SQL代碼祝闻,只需像操作對象一樣從數(shù)據(jù)庫操作數(shù)據(jù)占卧。

    讓軟件開發(fā)人員專注于業(yè)務(wù)邏輯的處理,提高了開發(fā)效率

  • ORM的劣勢

    ORM的缺點是會在一定程度上犧牲程序的執(zhí)行效率联喘。

    ORM用多了SQL語句就不會寫了华蜒,關(guān)系數(shù)據(jù)庫相關(guān)技能退化...

  • ORM總結(jié)

    ORM只是一種工具,工具確實能解決一些重復豁遭,簡單的勞動叭喜。這是不可否認的。

    但我們不能指望某個工具能一勞永逸地解決所有問題蓖谢,一些特殊問題還是需要特殊處理的捂蕴。

    但是在整個軟件開發(fā)過程中需要特殊處理的情況應(yīng)該都是很少的,否則所謂的工具也就失去了它存在的意義

ORM中的Model

在Django中model是你數(shù)據(jù)的單一蜈抓、明確的信息來源启绰。它包含了你存儲的數(shù)據(jù)的重要字段和行為。通常沟使,一個模型(model)映射到一個數(shù)據(jù)庫表
每個模型都是一個Python類委可,它是django.db.models.Model的子類。
模型的每個屬性都代表一個數(shù)據(jù)庫字段

5cf787fc5212844626

1.字段類型

from django.db import models

class Person(models.Model):
    # Django會在數(shù)據(jù)庫中自動創(chuàng)建一個列名為id且自增的整數(shù)列
    # 也可以自定義
    # z_id = models.AutoField(primary_key=True)  # 此處為自定義
    name = models.CharField(max_length=10)
    age = models.IntegerField()
  • 主外鍵

    • AutoField(Field):int自增列腊嗡,必須填入?yún)?shù) primary_key=True

    • BigAutoField(AutoField):bigint自增列着倾,必須填入?yún)?shù) primary_key=True

    • ForeignKey():定義外鍵

    • OneToOneField():一對一字段

    • ManyToManyField():多對多字段

  • 數(shù)字

    • IntegerField(Field):整數(shù)列(有符號的) -2147483648 ~ 2147483647
    • SmallIntegerField(IntegerField):小整數(shù) -32768 ~ 32767
    • PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField): 正整數(shù) 0 ~ 2147483647
    • PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField):正小整數(shù) 0 ~ 32767
    • BigIntegerField(IntegerField):長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
    • DurationField(Field):長整數(shù),時間間隔燕少,數(shù)據(jù)庫中按照bigint存儲卡者,ORM中獲取的值為datetime.timedelta類型
    • FloatField(Field):浮點型
    • DecimalField(Field):
      • 10進制小數(shù)
      • 參數(shù):
        • max_digits,小數(shù)總長度
        • decimal_places客们,小數(shù)位長度
    • BinaryField(Field):二進制類型
  • 布爾

    • BooleanField(Field):布爾值類型
    • NullBooleanField(Field):可以為空的布爾值
  • 字符串

    • CharField(Field)
      • 字符類型
      • 必須提供max_length參數(shù)崇决, max_length表示字符長度
    • TextField(Field):文本類型
    • EmailField(CharField):字符串類型材诽,Django Admin以及ModelForm中提供驗證機制
    • IPAddressField(Field):字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
    • GenericIPAddressField(Field)
      • 字符串類型恒傻,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
      • 參數(shù):
        • protocol脸侥,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
        • unpack_ipv4盈厘, 如果指定為True睁枕,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1沸手,開啟刺功能外遇,需要protocol="both"
    • URLField(CharField):字符串類型,Django Admin以及ModelForm中提供驗證 URL
    • SlugField(CharField):字符串類型契吉,Django Admin以及ModelForm中提供驗證支持 字母跳仿、數(shù)字、下劃線栅隐、連接符(減號)
    • CommaSeparatedIntegerField(CharField):字符串類型塔嬉,格式必須為逗號分割的數(shù)字
    • UUIDField(Field):字符串類型玩徊,Django Admin以及ModelForm中提供對UUID格式的驗證
    • FilePathField(Field)
      • 字符串租悄,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
      • 參數(shù):
        • path, 文件夾路徑
        • match=None, 正則匹配
        • recursive=False, 遞歸下面的文件夾
        • allow_files=True, 允許文件
        • allow_folders=False, 允許文件夾
    • FileField(Field):
      • 字符串,路徑保存在數(shù)據(jù)庫恩袱,文件上傳到指定目錄
      • 參數(shù):
        • upload_to = "" 上傳文件的保存路徑
        • storage = None 存儲組件泣棋,默認django.core.files.storage.FileSystemStorage
    • ImageField(FileField):
      • 字符串,路徑保存在數(shù)據(jù)庫畔塔,文件上傳到指定目錄
      • 參數(shù)
        • upload_to = "" 上傳文件的保存路徑
        • storage = None 存儲組件潭辈,默認django.core.files.storage.FileSystemStorage
        • width_field=None, 上傳圖片的高度保存的數(shù)據(jù)庫字段名(字符串)
        • height_field=None 上傳圖片的寬度保存的數(shù)據(jù)庫字段名(字符串)
  • 日期和時間

    • DateTimeField(DateField):日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    • DateField(DateTimeCheckMixin, Field):日期格式 YYYY-MM-DD
    • TimeField(DateTimeCheckMixin, Field):時間格式 HH:MM[:ss[.uuuuuu]]

2.字段參數(shù)

  • null:數(shù)據(jù)庫中字段是否可以為空

  • db_column:數(shù)據(jù)庫中字段的列名

  • db_tablespace:自定義數(shù)據(jù)庫表空間的名字。默認值是工程的DEFAULT_TABLESPACE設(shè)置

  • default:數(shù)據(jù)庫中字段的默認值

  • primary_key:數(shù)據(jù)庫中字段是否為主鍵

  • db_index:數(shù)據(jù)庫中字段是否可以建立索引

  • unique:數(shù)據(jù)庫中字段是否可以建立唯一索引

  • 時間字段獨有

    • auto_now_add:配置auto_now_add=True澈吨,創(chuàng)建數(shù)據(jù)記錄的時候會把當前時間添加到數(shù)據(jù)庫
    • auto_now:配置上auto_now=True把敢,每次更新數(shù)據(jù)記錄的時候會更新該字段
  • ForeignKey

    • to:設(shè)置要關(guān)聯(lián)的表
    • to_field:設(shè)置要關(guān)聯(lián)的字段
    • related_name:反向操作時,使用的字段名谅辣,用于代替原反向查詢時的'表名_set'
    • related_query_name:反向查詢操作時修赞,使用的連接前綴,用于替換表名
    • on_delete:當刪除關(guān)聯(lián)表中的數(shù)據(jù)時桑阶,當前表與其關(guān)聯(lián)的行的行為
      • models.CASCADE:刪除關(guān)聯(lián)數(shù)據(jù)柏副,與之關(guān)聯(lián)也刪除
      • models.DO_NOTHING:刪除關(guān)聯(lián)數(shù)據(jù),引發(fā)錯誤IntegrityError
      • models.PROTECT:刪除關(guān)聯(lián)數(shù)據(jù)蚣录,引發(fā)錯誤ProtectedError
      • models.SET_NULL:刪除關(guān)聯(lián)數(shù)據(jù)割择,與之關(guān)聯(lián)的值設(shè)置為null(前提FK字段需要設(shè)置為可空)
      • models.SET_DEFAULT:刪除關(guān)聯(lián)數(shù)據(jù),與之關(guān)聯(lián)的值設(shè)置為默認值(前提FK字段需要設(shè)置默認值)
      • models.SET:刪除關(guān)聯(lián)數(shù)據(jù)
        • 與之關(guān)聯(lián)的值設(shè)置為指定值萎河,設(shè)置:models.SET(值)
        • 與之關(guān)聯(lián)的值設(shè)置為可執(zhí)行對象的返回值荔泳,設(shè)置:models.SET(可執(zhí)行對象)
    • db_constraint:是否在數(shù)據(jù)庫中創(chuàng)建外鍵約束蕉饼,默認為True
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市玛歌,隨后出現(xiàn)的幾起案子椎椰,更是在濱河造成了極大的恐慌,老刑警劉巖沾鳄,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慨飘,死亡現(xiàn)場離奇詭異,居然都是意外死亡译荞,警方通過查閱死者的電腦和手機瓤的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吞歼,“玉大人圈膏,你說我怎么就攤上這事「萋猓” “怎么了稽坤?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長糯俗。 經(jīng)常有香客問我尿褪,道長,這世上最難降的妖魔是什么得湘? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任杖玲,我火速辦了婚禮,結(jié)果婚禮上淘正,老公的妹妹穿的比我還像新娘摆马。我一直安慰自己,他們只是感情好鸿吆,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布囤采。 她就那樣靜靜地躺著,像睡著了一般惩淳。 火紅的嫁衣襯著肌膚如雪蕉毯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天黎泣,我揣著相機與錄音恕刘,去河邊找鬼。 笑死抒倚,一個胖子當著我的面吹牛褐着,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播托呕,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼含蓉,長吁一口氣:“原來是場噩夢啊……” “哼频敛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馅扣,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斟赚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后差油,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拗军,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年蓄喇,在試婚紗的時候發(fā)現(xiàn)自己被綠了发侵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆偏,死狀恐怖刃鳄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钱骂,我是刑警寧澤叔锐,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站见秽,受9級特大地震影響愉烙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜张吉,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一齿梁、第九天 我趴在偏房一處隱蔽的房頂上張望催植。 院中可真熱鬧肮蛹,春花似錦、人聲如沸创南。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稿辙。三九已至昆码,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邻储,已是汗流浹背赋咽。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吨娜,地道東北人脓匿。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像宦赠,于是被迫代替她去往敵國和親陪毡。 傳聞我的和親對象是個殘疾皇子米母,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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