Django中不溜教程(4)模型層(1)之定義Model

@TOC

前言

我們?cè)贒jango快速入門(mén)的三個(gè)章節(jié)簡(jiǎn)單的體驗(yàn)了一下Django的使用,當(dāng)然只是使用到了其中的小部分功能妇蛀,但是我們沒(méi)有必要再入門(mén)demo中平鋪沒(méi)有重點(diǎn)的學(xué)習(xí)過(guò)多的知識(shí)點(diǎn)厂抽,接下來(lái)我們會(huì)針對(duì)某個(gè)模塊進(jìn)行詳細(xì)系統(tǒng)的學(xué)習(xí)筷凤,當(dāng)前章節(jié)主要討論模型藐守。

思考:
在我們快速入門(mén)的demo中有沒(méi)有涉及到MTV的設(shè)計(jì)模式。

模型層定義

我們這里說(shuō)的模型其實(shí)就是MTV中的M乾蓬,模型的功能是描述數(shù)據(jù)任内,存儲(chǔ)數(shù)據(jù)的字段與行為族奢,說(shuō)白了模型就是一個(gè)有對(duì)應(yīng)數(shù)據(jù)庫(kù)表的類(lèi)丹鸿。
模型層是一種抽象概念靠欢,包含對(duì)各個(gè)模型對(duì)象的相關(guān)操作门怪。在模型層級(jí)Django提供給開(kāi)發(fā)者的功能主要有兩個(gè):1根據(jù)Model對(duì)象構(gòu)建數(shù)據(jù)表锅纺。2自動(dòng)生成操縱數(shù)據(jù)API囤锉。

模型(Model類(lèi))的定義

根據(jù)設(shè)計(jì)的表結(jié)構(gòu)在models.py文件中定義繼承于django.db.models.Model的類(lèi),類(lèi)的字段對(duì)應(yīng)數(shù)據(jù)庫(kù)表字段酿傍,類(lèi)型也要對(duì)應(yīng)赤炒,比如mysql中varcahr字段對(duì)應(yīng)代碼中需要使用CharField定義亏较。



from django.db import models


# Create your models here.

# 根據(jù)表結(jié)構(gòu)創(chuàng)建模型雪情,定義類(lèi)繼承于models.Model
from django.utils import timezone


class news(models.Model):
    # 每一個(gè)屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)表的一個(gè)字段
    # 因?yàn)閠itle在數(shù)據(jù)庫(kù)表中是以字符形式存在旺罢,對(duì)應(yīng)實(shí)體類(lèi)指定為CharField,max_length表示最大長(zhǎng)度
    title = models.CharField(max_length=50)
    content = models.CharField(max_length=200)
    # 發(fā)表時(shí)間绢记,時(shí)間類(lèi)型,指定默認(rèn)值為當(dāng)前時(shí)間蠢熄,注意timezone的包
    pub_date = models.DateTimeField("保存日期",default = timezone.now)

    #
    def __str__(self):
        return self.title + "," + self.content + "," + self.pub_date.strftime("%Y-%m-%d")

主鍵的設(shè)定

默認(rèn)Django會(huì)自動(dòng)在每一個(gè)Model類(lèi)的基礎(chǔ)上新增一個(gè)自增的數(shù)字字段作為主鍵:

#這是Django自己新增的签孔,不需要我們手動(dòng)書(shū)寫(xiě)一下代碼
id = models.AutoField(primary_key=True)

我們可以取消這個(gè)功能饥追,自行手動(dòng)指定主鍵罐盔,只需要為自己的主鍵字段指定primary_key=True即可惶看,這樣Django就不再自動(dòng)新增主鍵。

class(models.Model):
        #創(chuàng)建stu_id為主鍵自動(dòng)遞增的數(shù)字主鍵
        stu_id=models.AutoField(primary_key=True)
        ....

某些時(shí)候我們并不想使用自增的數(shù)字幅骄,而是UUID拆座,Django也為我們提供好了自動(dòng)生成并插入uuid的功能:

class(models.Model):
        #創(chuàng)建stu_id為主鍵自動(dòng)遞增的數(shù)字主鍵
        #參數(shù)分別為:指定當(dāng)前屬性對(duì)應(yīng)的字段為主鍵,挪凑,铐达,一定要指定默認(rèn)值
        stu_id=models.UUIDField(primary_key=True, default=uuid.uuid4)
        ....

模型字段

模型中的屬性名稱(chēng)

定義字段名時(shí)應(yīng)避免使用關(guān)鍵字,比如數(shù)據(jù)庫(kù)中的關(guān)鍵字:desc,select,where等唐断,還有 模型 API 沖突的名稱(chēng)脸甘, 如 clean, save, delete 等.

模型中的字段類(lèi)型

定義數(shù)據(jù)就是聲明字段丹诀。要根據(jù)實(shí)際情況選擇字段的類(lèi)型,字段類(lèi)型主要還有以下功能:
1Django根據(jù)類(lèi)中指定的字段類(lèi)型創(chuàng)建表中的字段
2具有基本的數(shù)據(jù)校驗(yàn)功能
常用字段類(lèi)型一覽:

類(lèi)型 功能
AutoField 根據(jù)可用ID自動(dòng)遞增硝桩,本質(zhì)是IntegerField
BigAutoField 一個(gè)64位整數(shù)碗脊,與AutoField類(lèi)似橄妆,不同之處在于它可存儲(chǔ)的范圍更廣害碾,占用空間大
BigIntegerField 一個(gè)64位整數(shù)
BinaryField 可存儲(chǔ)二進(jìn)制數(shù)據(jù)。比如保存轉(zhuǎn)成二進(jìn)制的文件芬沉,不推薦使用
BooleanField 真/假字段
CharField 字符串字段花嘶,用于小到大的字符串蹦漠,有一個(gè)必要屬性max_length
TextField 超大文本笛园,比如保存小說(shuō)
DateField 日期
DateTimeField 日期和時(shí)間
DecimalField 一個(gè)固定精度的十進(jìn)制數(shù)研铆,Decimal在mysql本質(zhì)是字符串棵红,一般要求精度的小數(shù)需要此類(lèi)型
EmailField 同CharField咧栗,會(huì)檢查該值是使用一個(gè)有效的電子郵件地址
FileField 文件上傳字段致板,保存了文件保存的路徑等信息
ImageField 同F(xiàn)ileField,保存圖片保存路徑與圖片信息素征,比如寬高
UUIDField 同CharField,用于存儲(chǔ)通用唯一標(biāo)識(shí)符的字段
IntegerField 一個(gè)整數(shù)御毅。-2147483648到2147483647。
FloatField 浮點(diǎn)數(shù)
... ...

還有幾個(gè)與表關(guān)系有關(guān)的字段類(lèi)型凤粗,我們?cè)诒黻P(guān)系中詳細(xì)介紹侈沪。

字段參數(shù)

在定義字段的時(shí)候除了要考慮類(lèi)型以外還需要注意參數(shù)亭罪,比如CharField的max_length參數(shù)表示指定字符串最大長(zhǎng)度歼秽。

class news(models.Model):
        #小括號(hào)中就是為字段指定的字段參數(shù)
         name =models.CharField(max_length=20)

常用通用參數(shù)一覽:

參數(shù) 功能
null 如果設(shè)置為 True燥筷,當(dāng)該字段為空時(shí),Django 會(huì)將數(shù)據(jù)庫(kù)中該字段設(shè)置為 NULL袍祖。默認(rèn)為 False 蕉陋。數(shù)據(jù)庫(kù)層面拨扶。
blank 如果設(shè)置為 True,該字段允許為空缩举。默認(rèn)為 False仅孩。涉及表單驗(yàn)證方面
default 指定默認(rèn)值
primary_key 如果設(shè)置為 True 惋嚎,將該字段設(shè)置為該模型的主鍵另伍。
unique 如果設(shè)置為 True绞旅,這個(gè)字段的值必須在整個(gè)表中保持唯一
verbose_name 字段備注名
editable 如果False因悲,該字段將不會(huì)顯示在管理員或任何其他字段中 ModelForm勺爱。在模型驗(yàn)證期間也會(huì)跳過(guò)它們。默認(rèn)是True
db_column 用于此字段的數(shù)據(jù)庫(kù)列的名稱(chēng)卫旱。如果沒(méi)有給出顾翼,Django將使用該字段的名稱(chēng)奈泪。
db_index 如果True,將為此字段創(chuàng)建數(shù)據(jù)庫(kù)索引拜姿。
choices 一系列二元組蕊肥,用作此字段的選項(xiàng)

我們這里演示以下choices參數(shù)的使用:
choice這個(gè)屬性,用來(lái)限制用戶做出選擇的范圍晴埂。比如說(shuō)性別的選擇(男或女),需要先提供一個(gè)二維的二元元組精耐,第一個(gè)元素表示存在數(shù)據(jù)庫(kù)內(nèi)真實(shí)的值(m或f)卦停,第二個(gè)表示頁(yè)面上顯示的具體內(nèi)容(男或女)。

#偽代碼


class person(models.Model):
        choice = (
            ('m', '男'),
            ('f', '女')
        )
        gender= models.CharField(max_length=1, choices=choice)

#創(chuàng)建一個(gè)person實(shí)例
p = person('m')
#保存到數(shù)據(jù)庫(kù)
p.save()
#對(duì)象將具有g(shù)et_FOO_display()方法獲取二元組中相對(duì)應(yīng)的第二個(gè)值僵芹,其中FOO是字段的名稱(chēng)
#得到的結(jié)果是 "男"
p.get_sex_display();

Meta選項(xiàng)

在Model模型類(lèi)的內(nèi)部定義 Meta類(lèi) 來(lái)給模型進(jìn)行一定的配置拇派,常用的比如排序選項(xiàng),數(shù)據(jù)庫(kù)表名自定義等疮方。
舉例:

from django.db import models

class men(models.Model):
    age= models.IntegerField()
    height=models.IntegerField()
  #定義內(nèi)部類(lèi)Meta選項(xiàng)
    class Meta: 
        #指定默認(rèn)排序茧彤,前綴"-"表示降序,如果去除前綴表示升序惫谤,?表示隨機(jī)排序
        #這里也可以按照多個(gè)字段進(jìn)行排序 ordering = ["-age"溜歪,“height”]
        ordering = ["-age"]
        #默認(rèn)表名格式是: 小寫(xiě)的應(yīng)用名_模型名险污,我們可以通過(guò)db_table 自定義表名
        db_table = "men"

多表操作

我們目前已經(jīng)可以根據(jù)需求創(chuàng)建單表映射的模型類(lèi),實(shí)際開(kāi)發(fā)中我們會(huì)有很多的表拯腮,并且表與表之間會(huì)有一定關(guān)系
多表操作我們也叫做表關(guān)系:
1一對(duì)一
2多對(duì)一动壤,一對(duì)多
3多對(duì)多
因篇幅原因淮逻,我們下一章節(jié)對(duì)多表操作進(jìn)行詳細(xì)介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哼丈,一起剝皮案震驚了整個(gè)濱河市醉旦,隨后出現(xiàn)的幾起案子车胡,更是在濱河造成了極大的恐慌照瘾,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逃默,死亡現(xiàn)場(chǎng)離奇詭異队秩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)筒主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)乌妙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)建钥,“玉大人,你說(shuō)我怎么就攤上這事泽艘「湟溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵然低,是天一觀的道長(zhǎng)雳攘。 經(jīng)常有香客問(wèn)我吨灭,道長(zhǎng)刑巧,這世上最難降的妖魔是什么海诲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任特幔,我火速辦了婚禮蚯斯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遭赂。我一直安慰自己横辆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著脆侮,像睡著了一般靖避。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盆犁,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天蚣抗,我揣著相機(jī)與錄音瓮下,去河邊找鬼讽坏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛路呜,可吹牛的內(nèi)容都是我干的胀葱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼庆锦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搂抒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起焰雕,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤矩屁,失蹤者是張志新(化名)和其女友劉穎蚜锨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體郭膛,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氛悬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年则剃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如捅。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棍现,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镜遣,到底是詐尸還是另有隱情己肮,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布悲关,位于F島的核電站谎僻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寓辱。R本人自食惡果不足惜艘绍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一诱鞠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敷存,春花似錦、人聲如沸涮俄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抡砂。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啤月,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工贸人, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘要,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親评甜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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