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