Python Django模型詳解
Django模型
Django的模型定義在models.py文件中。模型是MVT中的M,也相當于MVC中的M。
在Django中,模型必須繼承自Model類。例如:
from django.db import models # Create your models here. class BookInfo(models.Model): # 一個模型類就會對應(yīng)生成數(shù)據(jù)庫中的一張表 """書籍模型""" name = models.CharField(max_length=128, verbose_name='名稱') # 類的屬性就是數(shù)據(jù)表中的字段。 pub_date = models.DateField(verbose_name='發(fā)布日期',null=True) readcount = models.IntegerField(default=0, verbose_name='閱讀量') commentcount = models.IntegerField(default=0, verbose_name='評論量') is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除') class Meta: # class Meta是固定寫法 db_table = 'bookinfo' # 指明數(shù)據(jù)庫表名 verbose_name = '圖書' # 在admin站點中顯示的名稱
注意
1.模型類如果未指明表名,Django默認以小寫app應(yīng)用名_小寫模型類名為數(shù)據(jù)庫表名,一般我們會通過db_table指明數(shù)據(jù)庫表名。
2.django會為表創(chuàng)建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設(shè)置某屬性為主鍵列后django不會再創(chuàng)建自動增長的主鍵列。默認創(chuàng)建的主鍵列屬性為id,也可以使用pk,意為primary key.
3.字段名稱中不能出現(xiàn)雙下劃線,因為這是Django的查詢語法之一。
自Django3.2后,可以在settings.py中配置DEFAULT_AUTO_FIELD參數(shù)來設(shè)置主鍵的數(shù)據(jù)類型,默認是DEFAULT_AUTO_FIELD = ‘django.db.models.BigAutoField',在Django3.2之前,默認生成的主鍵數(shù)據(jù)類型是AutoField.
下面是Django中常用的字段類型的詳情
字段類型
類型 | 說明 |
---|---|
BigAutoField | 自動增長的BigIntegerField,通常不用指定,不指定時Django會自動創(chuàng)建屬性名為id的自動增長屬性 |
BooleanField | 布爾字段,值為True或False |
NullBooleanField | 支持Null、True、False三種值 |
CharField | 字符串,參數(shù)max_length表示最大字符個數(shù) |
TextField | 大文本字段,一般超過4000個字符時使用 |
IntegerField | 整數(shù) |
DecimalField | 十進制浮點數(shù), 參數(shù)max_digits表示總位數(shù), 參數(shù)decimal_places表示小數(shù)位數(shù) |
FloatField | 浮點數(shù) |
DateField | 日期, 參數(shù)auto_now表示每次保存對象時,自動設(shè)置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為False; 參數(shù)auto_now_add表示當對象第一次被創(chuàng)建時自動設(shè)置當前時間,用于創(chuàng)建的時間戳,它總是使用當前日期,默認為False; 參數(shù)auto_now_add和auto_now是相互排斥的,組合將會發(fā)生錯誤 |
TimeField | 時間,參數(shù)同DateField |
DateTimeField | 日期時間,參數(shù)同DateField |
FileField | 上傳文件字段 |
ImageField | 繼承于FileField,對上傳的內(nèi)容進行校驗,確保是有效的圖片 |
下面是字段類型中的參數(shù)
字段類型的參數(shù)
參數(shù) | 說明 |
---|---|
null | 如果為True,表示允許為空,默認值是False |
blank | 如果為True,則該字段允許為空白,默認值是False |
db_column | 字段的名稱,如果未指定,則使用屬性的名稱 |
db_index | 若值為True, 則在表中會為此字段創(chuàng)建索引,默認值是False |
default | 為字段指定默認值 |
primary_key | 若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用 |
unique | 如果為True, 這個字段在表中必須有唯一值,默認值是False |
choices | 該參數(shù)是從一系列的二元組中提供選項 |
注意
1.CharField字段必須要指定參數(shù)max_length
2.還可以為字段指定參數(shù)verbose_name,這個參數(shù)主要是用來在admin管理頁面使用,其實是和本地化有關(guān)的。例如可以在上面的name字段指定參數(shù)verbose_name=“書籍名稱”,那么在admin管理頁面就會看到書籍名稱。
3.null參數(shù)是數(shù)據(jù)庫層面的,設(shè)置null=True之后,表示數(shù)據(jù)庫的該字段可以為空;blank參數(shù)是表單層面(HTML),blank=True之后,表示表單填寫該字段的時候可以不填。
外鍵
外鍵這個東西,通常都是在業(yè)務(wù)邏輯層面來實現(xiàn)的,而不是在數(shù)據(jù)庫中實現(xiàn)。但是通常大家學習的數(shù)據(jù)庫課程中,都會有數(shù)據(jù)庫設(shè)計范式,其中有個第三范式就是專指的外鍵約束。在這里只是簡單的介紹一下。下面是另外一個模型,和前面的BookInfo模型通過外鍵關(guān)聯(lián)起來。
class PeopleInfo(models.Model): """人員模型""" GENDER_CHOICES = ( (0, 'male'), (1, 'female') ) name = models.CharField(max_length=20, verbose_name='名稱') gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別') description = models.CharField(max_length=200, null=True, verbose_name='描述信息') book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵 is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除') class Meta: db_table = 'peopleinfo' verbose_name = '人物信息'
下面重點來說一下choices這個參數(shù)和models.ForeignKey。 choices參數(shù)就是從我們定義的二元組(GENDER_CHOICES)中獲取值。二元組的第一個值會儲存在數(shù)據(jù)庫中,而第二個值將只會用于在表單中顯示。對于一個模型實例,要獲取該字段二元組中相對應(yīng)的第二個值,使用 get_FOO_display() 方法。例如:獲取上面的性別信息,可以使用get_gender_display()方法。 外鍵:通過使用models.ForeignKey來設(shè)置外鍵,F(xiàn)oreignKey的第一個參數(shù)是要關(guān)聯(lián)的模型類名,第二個參數(shù)是on_delete。它的常用值可以如下: CASCADE級聯(lián),刪除主表數(shù)據(jù)時連通一起刪除外鍵表中數(shù)據(jù) PROTECT保護,通過拋出ProtectedError異常,來阻止刪除主表中被外鍵應(yīng)用的數(shù)據(jù) SET_NULL設(shè)置為NULL,僅在該字段null=True允許為null時可用 SET_DEFAULT設(shè)置為默認值,僅在該字段設(shè)置了默認值時可用 SET()設(shè)置為特定值或者調(diào)用特定方法 DO_NOTHING不做任何操作,如果數(shù)據(jù)庫前置指明級聯(lián)性,此選項會拋出IntegrityError異常
注意:我們在數(shù)據(jù)庫中,設(shè)置外鍵的時候需要制定另一張表中關(guān)聯(lián)的字段,但是在Django里并沒有指定。這是因為Django會默認指定另外一張表的id作為關(guān)聯(lián)字段。如下圖所示:
可以看到peopleinfo這張表中的外鍵名稱是book_id
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
基于Python利用Pygame實現(xiàn)翻轉(zhuǎn)圖像
這篇文章主要介紹了基于Python利用Pygame實現(xiàn)翻轉(zhuǎn)圖像,我們將了解如何使用Pygame翻轉(zhuǎn)圖像,要翻轉(zhuǎn)圖像,我們需要使用pygame.transform.flip(Surface,?xbool,?ybool)?方法,該方法被調(diào)用來根據(jù)我們的需要在垂直方向或水平方向翻轉(zhuǎn)圖像,下面來看看具體的實現(xiàn)過程吧2022-02-02Python內(nèi)置模塊Collections的使用教程詳解
collections 是 Python 的一個內(nèi)置模塊,所謂內(nèi)置模塊的意思是指 Python 內(nèi)部封裝好的模塊,無需安裝即可直接使用。本文將詳解介紹Collections的使用方式,需要的可以參考一下2022-03-03對Python中TKinter模塊中的Label組件實例詳解
今天小編就為大家分享一篇對Python中TKinter模塊中的Label組件實例詳解,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06python 禁止函數(shù)修改列表的實現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython 禁止函數(shù)修改列表的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08Python 實現(xiàn)將數(shù)組/矩陣轉(zhuǎn)換成Image類
今天小編就為大家分享一篇Python 實現(xiàn)將數(shù)組/矩陣轉(zhuǎn)換成Image類,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01Python venv虛擬環(huán)境跨設(shè)備遷移的實現(xiàn)
本文主要介紹了Python venv虛擬環(huán)境跨設(shè)備遷移的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06