~~~python
# 進入包含有 manage.py 的文件夾
python manage.py makemigrations
python manage.py migrate
~~~
```
\# class Person(models.Model): ?
\# ? ? # 表的字段信息都可以在代碼中取到。
\# ? ? # 取到Person表所有的fields: fields = Person.\_meta.fields
\# ? ? # 取所有字段的 verbose\_name ? ?
\# ? ? # verbose\_name\_list = \[field.verbose\_name for field in fields\] ? ? ?
\# ? ? # 字段名:field.name, ? ?
\# ? ? # 字段的值:getattr(Person, field.name) ? ?
\# ? ? # verbose\_name 是 字段備注信息,help\_text 是 字段補充說明,
\# ? ? age = models.IntegerFiedl(null=True, verbose\_name="這是年齡") ?
\# ? ? class Meta: ? ? ? ?
\# ? ? ? ? # 表備注 ? ? ? ?
\# ? ? ? ? verbose\_name = "個人信息表"
\# 通過上面的介紹我們知道 Meta 類的作用就是用于定義 Model 的元數據,即不屬于 Model 的字段,但是可以用來標識字段一些屬性,下面我們介紹 Meta 定義的常見元數據以及如何在 Model 中使用它們。
\# 1) abstract
\# 一個布爾類型的變量。這個屬性是定義當前的模型是不是一個抽象類。所謂抽象類是不會對應數據庫表的。一般我們用它來歸納一些公共屬性字段,然后繼承它的子類可以繼承這些字段。如果 abstract = True 這個 model 就是一個抽象類。
\# 2) ordering
\# 用于執行獲取對象列表時的排序規則。它是一個字符串的列表或元組對象,它的使用格式是由代表字段的字符串和一個表明降序的'-'構成。當字段名前面沒有'-'時,將默認使用升序排列。使用'?'將會隨機排列。示例如下所示:
\# ordering=\["add\_time"\] #按照升序排序
\# ordering=\["-add\_time"\]#按照降序
\# ordering=\["?add\_time"\]#隨機排序
\# #同時指定多個字段來進行排序
\# ordering=\['add\_time','-last\_login\_time'\]#先按升序,在按降序
\# 3) verbose\_name\_plural
\# 這個元數據主要用在管理后臺的展示上,verbose\_name\_plural 是模型類的復數名 。如果不設置的話,Django 會使用小寫的模型名作為默認值,并且在結尾加上 s。通過此項元數據設置名字可以去掉 s。 可參見《Django Admin數據表可視化》一節。
\# 4) db\_table
\# 這個字段用于指定數據表的名稱,通常沒有特別需求,將按照 Django 默認的規則生成 Model 對應的數據庫表名。
\# #定義該model在數據庫中的表名稱
\# db\_table = 'Students'
\# #使用自定義的表名,可以通過以下屬性
\# table\_name = 'my\_owner\_table'
\# 5) app\_lable
\# 這個選項只在一種使用情形,就是你的模型不在默認的應用程序包下的 models.py 文件中,這時候需要指定你這個模型是哪個應用程序的 app\_label = 'app\_name'。
\# 6) managed
\# 它是一個布爾類型的變量,默認為 Ture,代表 Django 會管理數據的生命周期,即利用 Django 提供的 syncdb 和 reset 命令可以完成創建和刪除數據表。如果為 False,則不會對此模型執行數據庫表創建或刪除操作。比如數據表之間存在 ManyToMany 的關系,在指定為 managed=False 的情況下,Django 不會自動創建中間表,需要我們自己手動創建。
\# 7) indexs
\# 它是一個列表類型的元數據項,用來定義 Model 的索引,列表中的每一個元素都是 Index 類型的實例。
\# Index 引自 django.db.models.indexes.Index
\# 8) default\_permissions
\# Django 默認會給每一個定義的 Model 設置三個權限即添加、更改、刪除,它使用格式:default\_permissions=('add','change','delete','view')
\# 9) permissions
\# 除了 Django 默認給 Model 添加的三個權限之外,還可以通過 permisssions 給 Model 添加額外的權限。不過 permissions 是一個包含二元組的元組或者列表,所以使用時應該注意格式,即 permissions=\[(權限代碼,權限名稱)\],示例如下所示:
\# permissions = \[(have\_read\_permission', '有讀的權限')\]
\# 10) unique\_together
\# 這個選項用于下面情形:當你需要通過兩個字段保持唯一性時使用。比如用戶的姓名(name)和 身份證號碼(ID number)兩者的組合必須是唯一的,那么需要這樣設置:
\# unique\_together = (("first\_name", "last\_name"),)
\# 一個 ManyToManyField 不能包含在 unique\_together 中。如果你需要驗證 ManyToManyField 字段的唯一驗證,嘗試使用 through 屬性進行關聯。
\# 11) proxy
\# 默認值為為 False, 如果設置成 Ture,則表示為基類、父類的代理模型。這個選項在后續章節還會進行相關介紹,它的主要作用就是創建父模型的代理模型。
\# 12) db\_tablespace
\# 表空間,用于優化數據庫性能,常用于 Oracle、PostgerSQL 數據庫。MySQL 數據庫不支持表空間,所以當數據存儲后端數據庫不支持的時候,Django 會在自動忽略這個元數據選項。
\# 13) get\_latest\_by
\# 指定一個 DateField 或者 DateTimeField 字段的名字,即 model 的屬性名字。使用示例如下:
\# get\_latest\_by = "order\_date"
\# 這個設置讓你在使用模型管理器的 lastest() 方法時,默認使用order\_date指定字段來排序。
\# 14) order\_with\_respect\_to
\# 這個選項一般用于多對多的關系中,它指向一個關聯對象并將該對象進行排序,使用元數據項后你會得到一個 get\_xxx\_order() 和set\_xxx\_order() 的方法,通過它們你可以設置或者得到排序的對象。
\# AutoField 自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性
\# BooleanField ?布爾字段,值為True或False
\# NullBooleanField ?支持Null、True、False三種值
\# CharField 字符串,參數max\_length表示最大字符個數
\# TextField 大文本字段,一般超過4000個字符時使用
\# IntegerField ?整數
\# DecimalField ?十進制浮點數, 參數max\_digits表示總位數, 參數decimal\_places表示小數位數
\# FloatField ? ?浮點數
\# DateField 日期, 參數auto\_now表示每次保存對象時,自動設置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為False; 參數auto\_now\_add表示當對象第一次被創建時自動設置當前時間,用于創建的時間戳,它總是使用當前日期,默認為False; 參數auto\_now\_add和auto\_now是相互排斥的,組合將會發生錯誤
\# TimeField 時間,參數同DateField
\# DateTimeField 日期時間,參數同DateField
\# FileField 上傳文件字段
\# ImageField ? ?繼承于FileField,對上傳的內容進行校驗,確保是有效的圖片
```
以上是一些注解
代碼示例:
```from django.db import models
#定義圖書模型類BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name='名稱')
bpub_date = models.DateField(verbose_name='發布日期')
bread = models.IntegerField(default=0, verbose_name='閱讀量')
bcomment = models.IntegerField(default=0, verbose_name='評論量')
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_books' # 指明數據庫表名
verbose_name = '圖書' # 在admin站點中顯示的名稱
verbose_name_plural = verbose_name # 顯示的復數名稱
def __str__(self):
"""定義每個數據對象的顯示信息"""
return self.btitle
#定義英雄模型類HeroInfo
class HeroInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
hname = models.CharField(max_length=20, verbose_name='名稱')
hgender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性別')
hcomment = models.CharField(max_length=200, null=True, verbose_name='描述信息')
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='圖書') # 外鍵
is_delete = models.BooleanField(default=False, verbose_name='邏輯刪除')
class Meta:
db_table = 'tb_heros'
verbose_name = '英雄'
verbose_name_plural = verbose_name
def __str__(self):
return self.hname
```