Django 學(xué)習(xí)筆記之模型高級用法(下)

題圖:by cfunk44 from Instagram

接著上篇文章內(nèi)容,本文分享自己對模型一些用法的總結(jié)。

1 模型的元數(shù)據(jù)Meta

除了抽象模型废膘,在模型中定義的字段都會成為表中的列。如果我們需要給模型指定其他一些信息慕蔚,例如排序方式丐黄、數(shù)據(jù)庫表名等,就需要用到 Meta孔飒。Meta 是一個可選的類灌闺,具體用法如下:

class Author(models.Model):
    name = models.CharField(max_length=40)
    email = models.EmailField()

    class Meta:
        managed = True
        db_table = 'author'

不知你是否對上述代碼有影響。通過 Django 將數(shù)據(jù)庫表反向生成模型時坏瞄,Django 會默認(rèn)帶上 managed 和 db_table 信息桂对。

我主要說下 Meta 一些重要的屬性,其他屬性你可以通過文檔信息進(jìn)行學(xué)習(xí)惦积。

abstract: 如果 abstract = True,模型會指定為抽象模型猛频。它相當(dāng)于面向?qū)ο缶幊讨械某橄蠡悺?/p>

proxy:如果設(shè)置了proxy = True狮崩,表示使用代理模式的模型繼承方式。

db_table:指定當(dāng)前模型在數(shù)據(jù)庫的表名鹿寻。

managed:該屬性默認(rèn)值為 True睦柴,表示能創(chuàng)建模型和操作數(shù)據(jù)庫表。

ordering:指定該模型生成的所有對象的排序方式毡熏。默認(rèn)按升序排列坦敌,如果在字段名前加上字符 “-” 則表示按降序排列,如果使用字符問號 “痢法?” 表示隨機排列狱窘。

ordering = ['pub_date']             # 表示按'pub_date'字段進(jìn)行升序排列
ordering = ['-pub_date']            # 表示按'pub_date'字段進(jìn)行降序排列
ordering = ['-pub_date', 'author']  # 表示先按'pub_date'字段進(jìn)行降序排列,再按`author`字段進(jìn)行升序排列财搁。

verbose_name:給模型設(shè)置別名蘸炸。如果不指定它,Django 會使用小寫的模型名作為默認(rèn)值尖奔。

verbose_name = "book"
verbose_name = "圖書"

verbose_name_plural:因為英語單詞有單數(shù)和復(fù)數(shù)兩種形式搭儒,這個屬性是模型對象的復(fù)數(shù)名。中文則跟 verbose_name 值一致提茁。如果不指定該選項淹禾,那么默認(rèn)的復(fù)數(shù)名字是 verbose_name 加上 ‘s’ 。

verbose_name_plural = "books"
verbose_name_plural = "圖書"

indexes:為當(dāng)前模型建立索引列表茴扁。用法如下:

from django.db import models

class Customer(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    class Meta:
        indexes = [
            models.Index(fields=['last_name', 'first_name']),
            models.Index(fields=['first_name'], name='first_name_idx'),
        ]

2 模型的繼承

根據(jù)模型的 Meta 信息設(shè)置铃岔,模型繼承方式可以分為三種:
1)抽象模型
模型的 Meta 類中含有 abstract = True 屬性。抽象模型一般被當(dāng)作基類峭火,它持有子類共有的字段德撬。值得注意的是铲咨,抽象模型在數(shù)據(jù)庫中不會生成表。

from django.db import models

# 抽象模型
class Person(models.Model):
    name = models.CharField(max_length=500)
    age = models.PositiveIntegerField()
    
    class Meta:
        abstract = True

# 子模型
class Student(Person):
    school_name = models.CharField(max_length=20)

子模型如果沒有定義 Meta 類蜓洪,那么會繼承抽象模型的 Meta 類纤勒。但是 abstract 屬性不會被繼承。

2)多表繼承
這種方式繼承方式隆檀,子模型的父模型可以一個或者多個摇天。

當(dāng)父類模型是正常的模型,即不是抽象模型恐仑,在數(shù)據(jù)庫中有對應(yīng)表泉坐。

雖然在 Model 層不推薦使用多重繼承,但 Django 的 ORM 還是支持這樣的使用方式裳仆。如果使用多表繼承腕让,子模型跟每個父模型都會添加一個一對一的關(guān)系。

from django.db import models

# 父模型 one
class Model_One(models.Model):
    attr1 = models.CharField(max_length=10)

# 父模型 two
class Model_Two(models.Model):
    attr2 = models.CharField(max_length=10)

# 子模型
class Multiple(Model_One, Model_Two):
    attr3 = models.CharField(max_length=10)

多重繼承的時候歧斟,子類的 ORM 映射會選擇第一個父類作為主鍵管理纯丸,其他的父類作為一般的外鍵管理。

3)代理模型
使用多表繼承時静袖,父類的每個子類都會創(chuàng)建一張新數(shù)據(jù)表觉鼻。但是我們只是想擴展一些方法,而不想改變模型的數(shù)據(jù)存儲結(jié)構(gòu)队橙。我們可以將在 Meta 類中增加約束proxy=True 來實現(xiàn)坠陈。此時子模型稱為父模型代理類,子類中只能增加方法捐康,而不能增加屬性仇矾。

from django.db import models
from django.contrib.auth.models import User

class Person(User):
    name = models.CharField(max_length=10)
    
    class Meta:
        proxy = True

    def do_something(self):
        pass

class Man(Person):
    job = models.CharField(max_length=20)

class Woman(Person):
    makeup = models.CharField(max_length=20)

3 寫在最后

我新建一個 Python Web 學(xué)習(xí)交流 QQ 群,群號:701534112解总。歡迎大家加群若未,一起交流,一起學(xué)習(xí)倾鲫,一起進(jìn)步粗合。


Python Web 學(xué)習(xí)交流群

往前 Django 學(xué)習(xí)筆記文章
Django 學(xué)習(xí)筆記之環(huán)境搭建
Django 學(xué)習(xí)筆記之初始
Django 學(xué)習(xí)筆記之視圖與URL配置
Django 學(xué)習(xí)筆記之模板
Django 學(xué)習(xí)筆記之模型(上)
Django 學(xué)習(xí)筆記之模型(下)
Django 學(xué)習(xí)筆記之后臺管理
Django 學(xué)習(xí)筆記之模型表單
Django 學(xué)習(xí)筆記之使用舊數(shù)據(jù)庫
Django 實戰(zhàn)1:搭建屬于自己社工查詢系統(tǒng)(上)
Django 實戰(zhàn)1:搭建屬于自己社工查詢系統(tǒng)(下)
Django 學(xué)習(xí)筆記之模型高級用法(上)


本文原創(chuàng)發(fā)布于微信公眾號「極客猴」,歡迎關(guān)注第一時間獲取更多原創(chuàng)分享

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乌昔,一起剝皮案震驚了整個濱河市隙疚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磕道,老刑警劉巖供屉,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡伶丐,警方通過查閱死者的電腦和手機悼做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哗魂,“玉大人肛走,你說我怎么就攤上這事÷急穑” “怎么了朽色?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長组题。 經(jīng)常有香客問我葫男,道長,這世上最難降的妖魔是什么崔列? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任梢褐,我火速辦了婚禮,結(jié)果婚禮上赵讯,老公的妹妹穿的比我還像新娘盈咳。我一直安慰自己,他們只是感情好瘦癌,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布猪贪。 她就那樣靜靜地躺著跷敬,像睡著了一般讯私。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上西傀,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天斤寇,我揣著相機與錄音,去河邊找鬼拥褂。 笑死娘锁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饺鹃。 我是一名探鬼主播莫秆,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悔详!你這毒婦竟也來了镊屎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤茄螃,失蹤者是張志新(化名)和其女友劉穎缝驳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡用狱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年运怖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏伊。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摇展,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出署海,到底是詐尸還是另有隱情吗购,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布砸狞,位于F島的核電站捻勉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏刀森。R本人自食惡果不足惜踱启,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望研底。 院中可真熱鬧埠偿,春花似錦、人聲如沸榜晦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乾胶。三九已至抖剿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間识窿,已是汗流浹背斩郎。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喻频,地道東北人缩宜。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像甥温,于是被迫代替她去往敵國和親锻煌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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