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

wanghui發表於2019-02-16

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

當模型和資料庫欄位不一致的問題

相關文章