模型常用屬性
常用字段:
在Django
中,定義了一些Field
來(lái)與數(shù)據(jù)庫(kù)表中的字段類(lèi)型來(lái)進(jìn)行映射冀偶。以下將介紹那些常用的字段類(lèi)型臼朗。
AutoField:
映射到數(shù)據(jù)庫(kù)中是int
類(lèi)型豹缀,可以有自動(dòng)增長(zhǎng)的特性藤巢。一般不需要使用這個(gè)類(lèi)型,如果不指定主鍵撵溃,那么模型會(huì)自動(dòng)的生成一個(gè)叫做id
的自動(dòng)增長(zhǎng)的主鍵疚鲤。如果你想指定一個(gè)其他名字的并且具有自動(dòng)增長(zhǎng)的主鍵,使用AutoField
也是可以的缘挑。
BigAutoField:
64位的整形集歇,類(lèi)似于AutoField
,只不過(guò)是產(chǎn)生的數(shù)據(jù)的范圍是從1-9223372036854775807
语淘。
BooleanField:
在模型層面接收的是True/False
诲宇。在數(shù)據(jù)庫(kù)層面是tinyint
類(lèi)型际歼。如果沒(méi)有指定默認(rèn)值,默認(rèn)值是None
姑蓝。
CharField:
在數(shù)據(jù)庫(kù)層面是varchar
類(lèi)型鹅心。在Python
層面就是普通的字符串。這個(gè)類(lèi)型在使用的時(shí)候必須要指定最大的長(zhǎng)度纺荧,也即必須要傳遞max_length
這個(gè)關(guān)鍵字參數(shù)進(jìn)去旭愧。
DateField:
日期類(lèi)型。在Python
中是datetime.date
類(lèi)型宙暇,可以記錄年月日输枯。在映射到數(shù)據(jù)庫(kù)中也是date
類(lèi)型。使用這個(gè)Field
可以傳遞以下幾個(gè)參數(shù):
-
auto_now
:在每次這個(gè)數(shù)據(jù)保存的時(shí)候客给,都使用當(dāng)前的時(shí)間用押。比如作為一個(gè)記錄修改日期的字段肢簿,可以將這個(gè)屬性設(shè)置為True
靶剑。 -
auto_now_add
:在每次數(shù)據(jù)第一次被添加進(jìn)去的時(shí)候,都使用當(dāng)前的時(shí)間池充。比如作為一個(gè)記錄第一次入庫(kù)的字段桩引,可以將這個(gè)屬性設(shè)置為True
。
DateTimeField:
日期時(shí)間類(lèi)型收夸,類(lèi)似于DateField
坑匠。不僅僅可以存儲(chǔ)日期,還可以存儲(chǔ)時(shí)間卧惜。映射到數(shù)據(jù)庫(kù)中是datetime
類(lèi)型厘灼。這個(gè)Field
也可以使用auto_now
和auto_now_add
兩個(gè)屬性。
TimeField:
時(shí)間類(lèi)型咽瓷。在數(shù)據(jù)庫(kù)中是time
類(lèi)型设凹。在Python
中是datetime.time
類(lèi)型。
EmailField:
類(lèi)似于CharField
茅姜。在數(shù)據(jù)庫(kù)底層也是一個(gè)varchar
類(lèi)型闪朱。最大長(zhǎng)度是254個(gè)字符。
FileField:
用來(lái)存儲(chǔ)文件的钻洒。這個(gè)請(qǐng)參考后面的文件上傳章節(jié)部分奋姿。
ImageField:
用來(lái)存儲(chǔ)圖片文件的。這個(gè)請(qǐng)參考后面的圖片上傳章節(jié)部分素标。
FloatField:
浮點(diǎn)類(lèi)型称诗。映射到數(shù)據(jù)庫(kù)中是float
類(lèi)型。
IntegerField:
整形头遭。值的區(qū)間是-2147483648——2147483647
寓免。
BigIntegerField:
大整形退腥。值的區(qū)間是-9223372036854775808——9223372036854775807
。
PositiveIntegerField:
正整形再榄。值的區(qū)間是0——2147483647
狡刘。
SmallIntegerField:
小整形。值的區(qū)間是-32768——32767
困鸥。
PositiveSmallIntegerField:
正小整形嗅蔬。值的區(qū)間是0——32767
。
TextField:
大量的文本類(lèi)型疾就。映射到數(shù)據(jù)庫(kù)中是longtext類(lèi)型澜术。
UUIDField:
只能存儲(chǔ)uuid
格式的字符串。uuid
是一個(gè)32位的全球唯一的字符串猬腰,一般用來(lái)作為主鍵鸟废。
URLField:
類(lèi)似于CharField
,只不過(guò)只能用來(lái)存儲(chǔ)url
格式的字符串姑荷。并且默認(rèn)的max_length
是200盒延。
Field的常用參數(shù):
null:
如果設(shè)置為True
,Django
將會(huì)在映射表的時(shí)候指定是否為空鼠冕。默認(rèn)是為False
添寺。在使用字符串相關(guān)的Field
(CharField/TextField)的時(shí)候,官方推薦盡量不要使用這個(gè)參數(shù)懈费,也就是保持默認(rèn)值False
计露。因?yàn)?code>Django在處理字符串相關(guān)的Field
的時(shí)候,即使這個(gè)Field
的null=False
憎乙,如果你沒(méi)有給這個(gè)Field
傳遞任何值票罐,那么Django
也會(huì)使用一個(gè)空的字符串""
來(lái)作為默認(rèn)值存儲(chǔ)進(jìn)去。因此如果再使用null=True
泞边,Django
會(huì)產(chǎn)生兩種空值的情形(NULL或者空字符串)该押。如果想要在表單驗(yàn)證的時(shí)候允許這個(gè)字符串為空,那么建議使用blank=True
繁堡。如果你的Field
是BooleanField
沈善,那么對(duì)應(yīng)的可空的字段則為NullBooleanField
。
blank:
標(biāo)識(shí)這個(gè)字段在表單驗(yàn)證的時(shí)候是否可以為空椭蹄。默認(rèn)是False闻牡。這個(gè)和null是有區(qū)別的,null是一個(gè)純數(shù)據(jù)庫(kù)級(jí)別的绳矩。而blank是表單驗(yàn)證級(jí)別的罩润。db_column:這個(gè)字段在數(shù)據(jù)庫(kù)中的名字。如果沒(méi)有設(shè)置這個(gè)參數(shù)翼馆,那么將會(huì)使用模型中屬性的名字割以。default:默認(rèn)值金度。可以為一個(gè)值严沥,或者是一個(gè)函數(shù)猜极,但是不支持lambda表達(dá)式。并且不支持列表/字典/集合等可變的數(shù)據(jù)結(jié)構(gòu)消玄。primary_key:是否為主鍵跟伏。默認(rèn)是False。unique:在表中這個(gè)字段的值是否唯一翩瓜。一般是設(shè)置手機(jī)號(hào)碼/郵箱等受扳。更多Field參數(shù)請(qǐng)參考官方文檔:https://docs.djangoproject.com/zh-hans/2.0/ref/models/fields/模型中Meta配置:對(duì)于一些模型級(jí)別的配置。我們可以在模型中定義一個(gè)類(lèi)兔跌,叫做Meta勘高。然后在這個(gè)類(lèi)中添加一些類(lèi)屬性來(lái)控制模型的作用。比如我們想要在數(shù)據(jù)庫(kù)映射的時(shí)候使用自己指定的表名坟桅,而不是使用模型的名稱(chēng)华望。那么我們可以在Meta類(lèi)中添加一個(gè)db_table的屬性。示例代碼如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
class Meta:
db_table = 'book_model'
以下將對(duì)Meta類(lèi)中的一些常用配置進(jìn)行解釋桦卒。db_table:這個(gè)模型映射到數(shù)據(jù)庫(kù)中的表名立美。如果沒(méi)有指定這個(gè)參數(shù),那么在映射的時(shí)候?qū)?huì)使用模型名來(lái)作為默認(rèn)的表名方灾。ordering:設(shè)置在提取數(shù)據(jù)的排序方式。后面章節(jié)會(huì)講到如何查找數(shù)據(jù)碌更。比如我想在查找數(shù)據(jù)的時(shí)候根據(jù)添加的時(shí)間排序裕偿,那么示例代碼如下:
class Book(models.Model):
name = models.CharField(max_length=20,null=False)
desc = models.CharField(max_length=100,name='description',db_column="description1")
pub_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'book_model'
ordering = ['pub_date']
更多的配置后面會(huì)慢慢介紹到。 官方文檔:https://docs.djangoproject.com/en/2.0/ref/models/options/