W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
遷移以磁盤格式存儲,這里稱為“遷移文件”。這些文件實際上是普通的 Python 文件,具有約定的對象布局,以聲明式風格編寫。
基本的遷移文件如下所示:
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [('migrations', '0001_initial')]
operations = [
migrations.DeleteModel('Tribble'),
migrations.AddField('Author', 'rating', models.IntegerField(default=0)),
]
Django 在加載遷移文件(作為 Python 模塊)時尋找的是 ?django.db.migrations.Migration
? 的子類,稱為 ?Migration
?。然后,它將檢查此對象的四個屬性,大多數(shù)情況下僅使用其中兩個:
dependencies
?,所依賴的遷移列表。operations
?,定義了此次遷移操作的 ?Operation
?類的列表。?operations
?是關鍵;它們是一組聲明性指令,它們告訴 Django 需要對哪些架構變更。Django 掃描它們并構建所有應用的所有架構變更的內(nèi)存表示形式,然后使用它生成進行架構變更的 SQL。
該內(nèi)存結構還用于確定模型與遷移當前狀態(tài)之間的差異;Django 按順序在內(nèi)存中的模型集上運行所有的變更,得出你上次運行 ?makemigrations
?時模型的狀態(tài)。然后,它使用這些模型與你的 ?models.py
? 文件中的模型進行比較,以計算出你改變了什么。
你應該很少需要手動編輯遷移文件,但如果需要,完全可以手動編寫。有些更復雜的操作是無法自動檢測的,只能通過手寫的遷移來實現(xiàn),所以如果必須手寫它們,也不要害怕。
你不能修改一個已經(jīng)遷移的自定義字段中的位置參數(shù)的數(shù)量,否則會引發(fā) ?TypeError
?。舊的遷移會用舊的簽名調(diào)用修改后的 ?__init__
? 方法。所以如果你需要一個新的參數(shù),請創(chuàng)建一個關鍵字參數(shù),并在構造函數(shù)中添加類似 ?assert 'argument_name' in kwargs
? 的內(nèi)容。
你可以選擇將管理器序列化為遷移,并在 ?RunPython
?操作中使用它們。這是通過在 ?manager
?類上定義一個 ?use_in_migrations
?屬性來實現(xiàn)的:
class MyManager(models.Manager):
use_in_migrations = True
class MyModel(models.Model):
objects = MyManager()
如果你使用 ?from_queryset()
? 函數(shù)動態(tài)生成管理器類,則需要從生成的類繼承以使其可導入:
class MyManager(MyBaseManager.from_queryset(CustomQuerySet)):
use_in_migrations = True
class MyModel(models.Model):
objects = MyManager()
應用的初始遷移是創(chuàng)建該應用首版表的遷移。 通常,一個應用有一個初始遷移,但是在某些情況下,復雜的模型依賴可能會導致兩個或更多。
初始遷移在遷移類上標有? initial = True
? 類屬性。如果未找到 ?initial
?類屬性,則如果遷移是應用程序中的第一個遷移(即,如果它不依賴于同一應用程序中的任何其他遷移)則將被視為初始。
當使用 ?migrate --fake-initial
? 選項時,將對這些初始遷移進行特殊處理。對于創(chuàng)建一個或多個表(?CreateModel
?操作)的初始遷移,Django 會檢查所有這些表是否已經(jīng)存在于數(shù)據(jù)庫中,如果是,則對遷移進行假應用。 類似地,對于添加了一個或多個字段(?AddField
?操作)的初始遷移,Django 檢查數(shù)據(jù)庫中是否已存在所有相應的列,如果存在,則對遷移進行假應用。如果沒有? --fake-initial
?,初始遷移的處理方式和其他遷移沒有區(qū)別。
歷史一致性前面已經(jīng)討論過,當兩個開發(fā)分支加入時,你可能需要手動線性化遷移。在編輯遷移依賴關系時,你可能會無意中創(chuàng)建一個不一致的歷史狀態(tài),即一個遷移已經(jīng)被應用,但它的一些依賴關系還沒有應用。這強烈地表明依賴關系不正確,所以 Django 會拒絕運行遷移或進行新的遷移,直到它被修復。當使用多個數(shù)據(jù)庫時,可以使用 ?database routers
? 的 ?allow_migrate()
? 方法來控制 ?makemigrations
?檢查哪些數(shù)據(jù)庫的歷史一致。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: