Django项目知识点(三)
https://mp.weixin.qq.com/s/ozPbJl5ZTn9MSWaxZUUqxA
本文一篇完全介紹django的最重要的model
6.django model
模型是數(shù)據(jù)唯一而且準(zhǔn)確的信息來源。它包含正在儲(chǔ)存的數(shù)據(jù)的重要字段和行為。一般來說,每一個(gè)模型都映射一個(gè)數(shù)據(jù)庫表。
這個(gè)模型定義了一個(gè) Person, 其擁有 first_name 和 last_name:
from django.db import modelsclass Person(models.Model):first_name = models.CharField(max_length=30)last_name = models.CharField(max_length=30)但是對(duì)于大多數(shù)的模型都是要機(jī)構(gòu)字段相同的,需要?jiǎng)?chuàng)建base.model(一般的位置再utils文件夾中)
from django.db import modelsclass BaseModel(models.Model):'''基類 公共字段'''create_time = models.DateTimeField('創(chuàng)建時(shí)間',auto_now_add=True)update_time = models.DateTimeField('修改時(shí)間',auto_now = True)is_delete = models.BooleanField('邏輯刪除',default=False)class Meta:# 抽象類, 用于繼承,遷移的時(shí)候不創(chuàng)建abstract = True對(duì)于抽象的模型如用戶注冊(cè)的AbstractUser,遷移時(shí)不應(yīng)該創(chuàng)建
Meta
使用內(nèi)部 Meta類 來給模型賦予元數(shù)據(jù)
# 這里的basemodel是上面的 class Teacher(BaseModel):name = models.CharField('講師姓名', max_length=150, help_text='講師名字')title = models.CharField('職稱', max_length=150, help_text='職稱')profile = models.TextField('簡介', help_text='簡介')photo = models.URLField('頭像url', default='', help_text='頭像url')class Meta:db_table = 'tb_teachers'verbose_name = '講師'verbose_name_plural = verbose_namedef __str__(self):return self.name下面是Meta常用選項(xiàng)
-
abstract
這個(gè)屬性是定義當(dāng)前的模型是不是一個(gè)抽象類。所謂抽象類是不會(huì)對(duì)應(yīng)數(shù)據(jù)庫表的。如果abstract = True 這個(gè)model就是一個(gè)抽象類 -
app_label
這個(gè)選型只在一種情況下使用,就是你的模型不在默認(rèn)的應(yīng)用程序包下的models.py文件中,這時(shí)候需要指定你這個(gè)模型是哪個(gè)應(yīng)用程序的。app_label = ‘myapp’ -
db_table
db_table是指定自定義數(shù)據(jù)庫表明的。Django有一套默認(rèn)的按照一定規(guī)則生成數(shù)據(jù)模型對(duì)應(yīng)的數(shù)據(jù)庫表明。定義該model在數(shù)據(jù)庫中的表名稱db_table = ‘Students’ -
get_latest_by
在model中指定一個(gè)DateField或者DateTimeField。這個(gè)設(shè)置讓你在使用model的Manager上的lastest方法時(shí),默認(rèn)使用指定字段來排序 -
managed
默認(rèn)值為True,這意味著Django可以使用syncdb和reset命令來創(chuàng)建或移除對(duì)應(yīng)的數(shù)據(jù)庫。默認(rèn)值為True,如果你不希望這么做,可以把manage的值設(shè)置為False -
order_with_respect_to
這個(gè)選項(xiàng)一般用于多對(duì)多的關(guān)系中,它指向一個(gè)關(guān)聯(lián)對(duì)象,就是說關(guān)聯(lián)對(duì)象找到這個(gè)對(duì)象后它是經(jīng)過排序的。指定這個(gè)屬性后你會(huì)得到一個(gè)get_xxx_order()和set_xxx_order()的方法,通過它們你可以設(shè)置或者回去排序的對(duì)象 -
ordering
這個(gè)字段是告訴Django模型對(duì)象返回的記錄結(jié)果集是按照哪個(gè)字段排序的。這是一個(gè)字符串的元組或列表,沒有一個(gè)字符串都是一個(gè)字段和用一個(gè)可選的表明降序的’-‘構(gòu)成。當(dāng)字段名前面沒有’-‘時(shí),將默認(rèn)使用升序排列。使用’?'將會(huì)隨機(jī)排列
- permissions
permissions主要是為了在Django Admin管理模塊下使用的,如果你設(shè)置了這個(gè)屬性可以讓指定的方法權(quán)限描述更清晰可讀。Django自動(dòng)為每個(gè)設(shè)置了admin的對(duì)象創(chuàng)建添加,刪除和修改的權(quán)限。
permissions = ((‘can_deliver_pizzas’,‘Can deliver pizzas’))
-
proxy
這是為了實(shí)現(xiàn)代理模型使用的,如果proxy = True,表示model是其父的代理 model -
unique_together
unique_together這個(gè)選項(xiàng)用于:當(dāng)你需要通過兩個(gè)字段保持唯一性時(shí)使用。比如假設(shè)你希望,一個(gè)Person的FirstName和LastName兩者的組合必須是唯一的,那么需要這樣設(shè)置:unique_together = ((“first_name”, “l(fā)ast_name”),)
注意:一個(gè)ManyToManyField不能包含在unique_together中。
如果你需要驗(yàn)證關(guān)聯(lián)到ManyToManyField字段的唯一驗(yàn)證,嘗試使用signal(信號(hào))或者明確指定through屬性。
-
verbose_name
verbose_name的意思很簡單,就是給你的模型類起一個(gè)更可讀的名字一般定義為中文,我們:
verbose_name = “學(xué)?!?/p> -
verbose_name_plural
這個(gè)選項(xiàng)是指定,模型的復(fù)數(shù)形式是什么,比如verbose_name_plural = "學(xué)校"如果不指定Django會(huì)自動(dòng)在模型名稱后加一個(gè)’s’
字段類型
-
models.CharField
字符串類型。必須接收一個(gè)max_length參數(shù).最常用的filed,沒有之一! -
models.TextField
大量文本內(nèi)容,在HTML中表現(xiàn)為Textarea標(biāo)簽,最常用的字段類型之一! -
models.BooleanField
在HTML表單中體現(xiàn)為CheckboxInput標(biāo)簽。如果要接收null值,請(qǐng)使用NullBooleanField。 -
models.IntegerField
整數(shù)類型,最常用的字段之一。取值范圍-2147483648到2147483647。在HTML中表現(xiàn)為NumberInput標(biāo)簽。優(yōu)先級(jí)一般使用這個(gè)字段 -
models.URLField
字符串類型,地址正則表達(dá)式,默認(rèn)最大長度200。 -
models.BinaryField
二進(jìn)制數(shù)據(jù)類型。使用受限,少用。 -
models.ImageField 圖片
-
models.FilePathField 文件
-
models.AutoField 自增列=int(11)
通常你不需要自己編寫它,Django會(huì)自動(dòng)幫你添加字段:id = models.AutoField(primary_key=True),如果沒有的話,默認(rèn)會(huì)生成一個(gè)名稱為id的列,如果要顯示的定義一個(gè)自增列,或者如果你非要自己設(shè)置主鍵,那么請(qǐng)務(wù)必將字段設(shè)置為primary_key=True。
注意:Django在一個(gè)模型中只允許有一個(gè)自增字段,并且該字段必須為主鍵!
models.DateField 日期字段類型date
注意:參數(shù)auto_now=True表示每次更新都會(huì)更新這個(gè)時(shí)間;參數(shù)auto_now_add表示只是第一次創(chuàng)建時(shí)添加,之后的更新不再改變
models.DateTimeField
日期時(shí)間類型。Python的datetime.datetime的實(shí)例。與DateField相比就是多了小時(shí)、分和秒的顯示,其它功能、參數(shù)、用法、默認(rèn)值等等都一樣
models.TimeField
時(shí)間字段,Python中datetime.time的實(shí)例。HH:MM[:ss[.uuuuuu]]
models.Decimal
十進(jìn)制小數(shù)類型=decimal,必須指定整數(shù)位max_digits和小數(shù)位decimal_places
models.EmailField
字符串類型(正則表達(dá)式郵箱)=varchar 對(duì)字符串進(jìn)行正則表達(dá)式驗(yàn)證,使用DJango內(nèi)置的EmailValidator進(jìn)行郵箱地址合法性驗(yàn)證。
models.FloatField
浮點(diǎn)類型=double
models.IntegerField
整形
models.BigIntegerField
長整形
models.IPAddressField
字符串類型(ip4正則表達(dá)式)
models.GenericIPAddressField
字符串類型(ip4和ip6是可選的)參數(shù)protocol可以是:both、ipv4、ipv6 驗(yàn)證時(shí),會(huì)根據(jù)設(shè)置進(jìn)行報(bào)錯(cuò)
models.NullBooleanField
models.ComaSeparatedIntegerField
用逗號(hào)分割的數(shù)字類型=varchar 繼承CharField,所以必須加max_lenght參數(shù)
主要講幾個(gè)重要的字段
CharField 和
TextField
三個(gè)必要參數(shù)
名稱
max_length
help_text
改寫字段傳入validators參數(shù)改寫的函數(shù)
null=True(默認(rèn)是false,不能為空)
blank=True 表示代碼中創(chuàng)建數(shù)據(jù)庫記錄時(shí)該字段可傳空白(空串,空字符串).
default 默認(rèn)為
FileField 和ImageField
上傳文件字段(不能設(shè)置為主鍵)。默認(rèn)情況下,該字段在HTML中表現(xiàn)為一個(gè)ClearableFileInput標(biāo)簽。
class MyModel(models.Model):photo = ImageField(upload_to = 'photos/')#實(shí)際的路徑就是 MEDIA_ROOT/photos/filename#所以可以用uoload_to來指定文件存放的前綴路徑#FileField也是同樣的定義height_field=None
width_field=None
height_field參數(shù):保存有圖片高度信息的模型字段名。width_field參數(shù):保存有圖片寬度信息的模型字段名。
DateTimeField
DateTimeField.auto_now
這個(gè)參數(shù)的默認(rèn)值為false,設(shè)置為true時(shí),能夠在保存該字段時(shí),將其值設(shè)置為當(dāng)前時(shí)間,并且每次修改model,都會(huì)自動(dòng)更新。
DateTimeField.auto_now_add
這個(gè)參數(shù)的默認(rèn)值也為False,設(shè)置為True時(shí),會(huì)在model對(duì)象第一次被創(chuàng)建時(shí),將字段的值設(shè)置為創(chuàng)建時(shí)的時(shí)間,以后修改對(duì)象時(shí),字段的值不會(huì)再更新。
字段常用參數(shù)
null
如果是True,Django會(huì)在數(shù)據(jù)庫中將此字段的值置為NULL,默認(rèn)值是False
blank
如果為True時(shí)django的 Admin 中添加數(shù)據(jù)時(shí)可允許空值,可以不填。如果為False則必須填。默認(rèn)是False。
null純粹是與數(shù)據(jù)庫有關(guān)系的。而blank是與頁面必填項(xiàng)驗(yàn)證有關(guān)的
primary_key = False
主鍵,對(duì)AutoField設(shè)置主鍵后,就會(huì)代替原來的自增 id 列
bauto_now 和 auto_now_add
auto_now 自動(dòng)創(chuàng)建—無論添加或修改,都是當(dāng)前操作的時(shí)間
auto_now_add 自動(dòng)創(chuàng)建—永遠(yuǎn)是創(chuàng)建時(shí)的時(shí)間
choices
一個(gè)二維的元組被用作choices,如果這樣定義,Django會(huì)select box代替普通的文本框,
并且限定choices的值是元組中的值
GENDER_CHOICE = (
(u’M’, u’Male’),
(u’F’, u’Female’),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
max_length
字段長度
default
默認(rèn)值
verbose_name
Admin中字段的顯示名稱,如果不設(shè)置該參數(shù)時(shí),則與屬性名。
db_column
數(shù)據(jù)庫中的字段名稱
unique=True
不允許重復(fù)
db_index = True
數(shù)據(jù)庫索引
meditable=True
在Admin里是否可編輯
error_messages=None
錯(cuò)誤提示
auto_created=False
自動(dòng)創(chuàng)建
help_text
在Admin中提示幫助信息
validators=[]
驗(yàn)證器
upload-to
文件上傳時(shí)的保存上傳文件的目錄
模型關(guān)系
基本原則:
一對(duì)一的表,兩表的屬性實(shí)際上完全可以合并成一個(gè)表,共用一個(gè)主鍵即可;
一對(duì)多的表,可以設(shè)中間關(guān)聯(lián)表,也可以將關(guān)聯(lián)表并入“多”這頭;若設(shè)獨(dú)立關(guān)聯(lián)表,則可引入“多”這頭的主鍵作為其主鍵,也可另立主鍵并將“一”和“多”兩表的主鍵作為關(guān)聯(lián)表的外鍵;
多對(duì)多的表,則必須設(shè)中間關(guān)聯(lián)表,關(guān)聯(lián)表設(shè)獨(dú)立主鍵,并引入兩個(gè)“多”頭的表的主鍵作為關(guān)聯(lián)表的外鍵。
ForeignKey: 一對(duì)多
ManyToManyField:多對(duì)多
OneToOneField: 一對(duì)一
on_delete參數(shù)說明:
有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五個(gè)可選擇的值
CASCADE:此值設(shè)置,是級(jí)聯(lián)刪除。
PROTECT:此值設(shè)置,是會(huì)報(bào)完整性錯(cuò)誤。
SET_NULL:此值設(shè)置,會(huì)把外鍵設(shè)置為null,前提是允許為null。
SET_DEFAULT:此值設(shè)置,會(huì)把設(shè)置為外鍵的默認(rèn)值。
SET():此值設(shè)置,會(huì)調(diào)用外面的值,可以是一個(gè)函數(shù)。
一對(duì)一:一個(gè)學(xué)生只有一個(gè)學(xué)號(hào)
一對(duì)多:一個(gè)學(xué)生有多個(gè)課程
多對(duì)多:多個(gè)學(xué)生有多個(gè)課程
一對(duì)多:當(dāng)一張表中創(chuàng)建一行數(shù)據(jù)時(shí),有一個(gè)單選的下拉框(可以被重復(fù)選擇)
一個(gè)學(xué)院信息表有多個(gè)學(xué)生的信息表
再比如文章和作者之間的關(guān)系。一個(gè)文章只能由一個(gè)作者編寫,但是一個(gè)作者可以寫多篇文章。文章和作者之間的關(guān)系就是典型的多對(duì)一的關(guān)系。作者和文章的關(guān)系就是一對(duì)多。
多對(duì)多:在某表中創(chuàng)建一行數(shù)據(jù)是,有一個(gè)可以多選的下拉框
不同的學(xué)生有不同課程表
再比如文章和標(biāo)簽的關(guān)系。一篇文章可以有多個(gè)標(biāo)簽,一個(gè)標(biāo)簽可以被多個(gè)文章所引用。因此標(biāo)簽和文章的關(guān)系是典型的多對(duì)多的關(guān)系。
一對(duì)一:在某表中創(chuàng)建一行數(shù)據(jù)時(shí),有一個(gè)單選的下拉框(下拉框中的內(nèi)容被用過一次就消失了)
一個(gè)學(xué)生信息表就只用一個(gè)對(duì)應(yīng)的詳細(xì)信息表
再比如一個(gè)用戶表和一個(gè)用戶信息表。在實(shí)際網(wǎng)站中,可能需要保存用戶的許多信息,但是有些信息是不經(jīng)常用的。如果把所有信息都存放到一張表中可能會(huì)影響查詢效率,因此可以把用戶的一些不常用的信息存放到另外一張表中我們叫做UserExtension。但是用戶表User和用戶信息表UserExtension就是典型的一對(duì)一了。
案例深入
一個(gè)學(xué)生只有一個(gè)學(xué)生的信息詳細(xì)表,多個(gè)學(xué)生有多個(gè)課程,通過中間關(guān)聯(lián)表就是學(xué)生報(bào)名表
在多對(duì)多中必須through=‘Enroll’ 就是有Enroll表才能有課程表,想下沒有學(xué)生報(bào)名還上什么課,必須設(shè)中間關(guān)聯(lián)表就是學(xué)生報(bào)名表
如果沒有學(xué)生,沒有課程來報(bào)名上學(xué)干嘛,所以是多對(duì)一,多個(gè)學(xué)生合成一張報(bào)名表
注意:外鍵和一對(duì)一關(guān)系的時(shí)候需要加on_delete選項(xiàng),此參數(shù)為了避免兩個(gè)表里的數(shù)據(jù)不一致問題,不然會(huì)報(bào)錯(cuò)!
一般使用CASCADE 表示級(jí)聯(lián)刪除
也就是有一個(gè)數(shù)據(jù)其中一個(gè)表刪了,管聊的表就會(huì)刪除,想下如果有個(gè)學(xué)生不讀了,刪掉了所有學(xué)生報(bào)名表中的數(shù)據(jù),它綁的外鍵的學(xué)生,課程,是不是先把它刪了,這就是級(jí)聯(lián)刪除,如果設(shè)置了SET_NULL就是把學(xué)生的信息刪了,它人留下來,下次在補(bǔ)信息就ok了
def str(self):
這個(gè)str的作用是美化打印出來的結(jié)果,使人類更方便查看
class Test:
def __init__(self, name, job):self.name = nameself.job = jobdef __str__(self):return 'Name:' + self.nameinstance = Test(‘maoli’, ‘student’)
print(instance)
Name: maoli
補(bǔ)充
必需字段
沒有mobile就不行
REQUIRED_FIELDS = [‘mobile’]
一直原創(chuàng),從未轉(zhuǎn)載
請(qǐng)認(rèn)準(zhǔn)我,將我置標(biāo)
總結(jié)
以上是生活随笔為你收集整理的Django项目知识点(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青岛到临清长途汽车几个小时?
- 下一篇: 国六B实施后,汽车行业会发生哪些变化?