@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ì)介紹。