Django基礎之六(模型理論知識)

Django模型理論知識

簡介

  • Django模型所在的位置:

URL--->視圖--->模型(mysql)

  • 什麼是模型:

    • 模型就是數據的唯一的&權威的信息源
    • 包含所存儲的詩句的必要字段和行爲(屬性和方法)
    • 一個模型對應一張表
  • 如何編寫模型:
模型:每個模型都用一個類表示,該類繼承自django.db.models.Model。每個模型有多個類的屬性變量,而每一個類的屬性變量又都代表了數據庫表中的一個字段
字段:每個字段通過Field類的一個實例表示 —— 例如字符字段CharField和日期字段DateTimeField。這種方法告訴Django,每個字段中保存着什麼類型的數據
字段名:每個Field 實例的名字(例如username)就是字段的名字,並且是機器可讀的格式。你將在Python代碼中使用到它的值,並且你的數據庫將把它用作表的列名

模型字段

文檔

自增主鍵Field

默認情況下Django會給每個模型添加下面這個字段

 id = models.AutoField(primary_key=True)

如果Django看到你顯式地設置了Field.primary_key, 就不會自動添加 id 列
每個模型只能有一個字段指定primary_key=True (無論是顯式聲明還是自動添加)

字段的自述信息

每個字段類型都接受一個可選的位置參數——字段的自述名,如果沒有給定自述名,Django將根據字段的屬性名稱自動創建自述名——將屬性名稱的下劃線替換成空格
ForeignKey、 ManyToManyField 和 OneToOneField 這三個可以使用verbose_name指定自述名

  • 例如:自述名爲:"person's first name"
    first_name = models.CharField("person's first name", max_length=30)
  • 例如:自述名爲:"first name"
    first_name = models.CharField(max_length=30)

字段選項

每個字段有一些特有的參數,例如,CharField(和它的派生類)需要max_length 參數來指定VARCHAR 數據庫字段的大小

  • null
如果爲True,Django將用NULL來在數據庫中存儲空值
默認值:False
  • blank
如果爲True , 該字段允許不填
默認值:False

null是純數據庫範疇,而blank是數據驗證範疇的
blank=True,表單驗證允許該字段爲空
blank=False,該字段就是必須的
  • choices
由二元組組成的一個可迭代對象(如列表或元組),用來給字段提供選擇項,如果設置了choices, 默認的表單將是一個選擇框,選擇框的選擇就是choices中的選項
  YEAR_IN_SCHOOL_CHOICES = (
     ('FR', 'Freshman'),
     ('SO', 'Sophomore'),
     ('JR', 'Junior'),
     ('SR', 'Senior'),
  )
  • default
字段的默認值,可以是一個值或者調用對象
  • primary_key
如果爲True,那麼這個字段就是模型的主鍵
  • unique
如果該值設置爲True,這個字段的值在整張表中必須是唯一的
  • index
普通索引

更多

模型Meta選項

使用內部的class Meta 定義模型的元數據,例如:

from django.db import models
class User(models.Model):
      username = models.IntegerField()
      class Meta:
          ordering = ["username"]
模型元數據是“任何不是字段的數據”,比如排序選項(ordering),數據庫表名(db_table)。在模型中添加class Meta是完全可選的,所有選項都不是必須的。
Meta選項列表
  • db_table:db_table是用於指定自定義數據庫表名的
Django有一套默認的按照一定規則生成數據模型對應的數據庫表名,如果你想使用自定義的表名,就通過這個屬性指定
若不提供該參數, Django 會使用 app_name + '_' + module_name 作爲表的名字
Django 會根據模型類的名稱和包含它的應用的名稱自動指定數據庫表名稱。一個模型的數據庫表名稱,由這個模型的“應用名” 和模型類名稱之間加上下劃線組成。
使用Meta類中的 db_table 參數來重寫數據表的名稱。
當你通過db_table覆寫表名稱時,強烈推薦使用小寫字母給表命名
  • ordering:這個字段是告訴Django模型對象返回的記錄結果集是按照哪個字段排序的
  class Meta:
      ordering = ['-order_date']
它是一個字符串的列表或元組。每個字符串是一個字段名,前面帶有可選的“-”前綴表示倒序。前面沒有“-”的字段表示正序。使用"?"來表示隨機排序。

  ordering = ['order_date'] # 按訂單升序排列
  ordering = ['-order_date'] # 按訂單降序排列,-表示降序
  ordering = ['?order_date'] # 隨機排序,?表示隨機
  ordering = ['-pub_date', 'author'] # 對 pub_date 降序,然後對 author 升序
  • app_label
app_label這個選項只在一種情況下使用,就是你的模型類不在默認的應用程序包下的models.py文件中,這時候你需要指定你這個模型類是那個應用程序的

  class Meta:
      app_label='myapp'
  • get_last_by
由於Django的管理方法中有個lastest()方法,就是得到最近一行記錄。如果你的數據模型中有 DateField 或 DateTimeField 類型的字段,你可以通過這個選項來指定lastest()是按照哪個字段進行選取的。
一個 DateField 或 DateTimeField 字段的名字. 若提供該選項, 該模塊將擁有一個 get_latest() 函數以得到 "最新的" 對象(依據那個字段):
  class Meta:
      get_latest_by = "order_date"
  • verbose_name的意思很簡單,就是給你的模型類起一個更可讀的名字
  class Meta:
      verbose_name = "pizza"
  • managed:管理第三方庫一定要設置成False
由於Django會自動根據模型類生成映射的數據庫表,如果你不希望Django這麼做,可以把managed的值設置爲False。
默認值爲True,這個選項爲True時Django可以對數據庫表進行 migrate或migrations、刪除等操作。在這個時間Django將管理數據庫中表的生命週期
如果爲False的時候,不會對數據庫表進行創建、刪除等操作。可以用於現有表、數據庫視圖等,其他操作是一樣的。

更多

數據庫的遷移

遷移是Django用於同步你的發生改變的模型(添加一個字段,刪除一個模型,等等)到你的數據庫,實質上也是就是管理數據表的生命週期

  • 遷移命令
makemigrations, 負責基於你的模型修改創建一個新的遷移
migrate, 負責執行遷移, 以及撤銷和列出遷移的狀態。
sqlmigrate, 展示遷移的sql語句
  • 生成遷移文件
python manage.py makemigrations dashboard
會掃描和比較你當前遷移文件裏面的版本,同時新的遷移文件會被創建
  • 展示遷移的sql語句
python manage.py sqlmigrate dashboard 0007
  • 數據遷移
python manage.py migrate dashboard

當模型和數據庫字段不一致的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章