新聞中心
遷移以磁盤(pán)格式存儲(chǔ),這里稱(chēng)為“遷移文件”。這些文件實(shí)際上是普通的 Python 文件,具有約定的對(duì)象布局,以聲明式風(fēng)格編寫(xiě)。

基本的遷移文件如下所示:
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? 的子類(lèi),稱(chēng)為 ?Migration?。然后,它將檢查此對(duì)象的四個(gè)屬性,大多數(shù)情況下僅使用其中兩個(gè):
- ?
dependencies?,所依賴(lài)的遷移列表。 - ?
operations?,定義了此次遷移操作的 ?Operation?類(lèi)的列表。
?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)編寫(xiě)。有些更復(fù)雜的操作是無(wú)法自動(dòng)檢測(cè)的,只能通過(guò)手寫(xiě)的遷移來(lái)實(shí)現(xiàn),所以如果必須手寫(xiě)它們,也不要害怕。
自定義字段
你不能修改一個(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ù)中添加類(lèi)似 ?assert 'argument_name' in kwargs? 的內(nèi)容。
模型管理器
你可以選擇將管理器序列化為遷移,并在 ?RunPython ?操作中使用它們。這是通過(guò)在 ?manager ?類(lèi)上定義一個(gè) ?use_in_migrations ?屬性來(lái)實(shí)現(xiàn)的:
class MyManager(models.Manager):
use_in_migrations = True
class MyModel(models.Model):
objects = MyManager()如果你使用 ?from_queryset()? 函數(shù)動(dòng)態(tài)生成管理器類(lèi),則需要從生成的類(lèi)繼承以使其可導(dǎo)入:
class MyManager(MyBaseManager.from_queryset(CustomQuerySet)):
use_in_migrations = True
class MyModel(models.Model):
objects = MyManager()
初始遷移
Migration.initial
應(yīng)用的初始遷移是創(chuàng)建該應(yīng)用首版表的遷移。 通常,一個(gè)應(yīng)用有一個(gè)初始遷移,但是在某些情況下,復(fù)雜的模型依賴(lài)可能會(huì)導(dǎo)致兩個(gè)或更多。
初始遷移在遷移類(lèi)上標(biāo)有? initial = True? 類(lèi)屬性。如果未找到 ?initial ?類(lèi)屬性,則如果遷移是應(yīng)用程序中的第一個(gè)遷移(即,如果它不依賴(lài)于同一應(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ù)庫(kù)中,如果是,則對(duì)遷移進(jìn)行假應(yīng)用。 類(lèi)似地,對(duì)于添加了一個(gè)或多個(gè)字段(?AddField ?操作)的初始遷移,Django 檢查數(shù)據(jù)庫(kù)中是否已存在所有相應(yīng)的列,如果存在,則對(duì)遷移進(jìn)行假應(yīng)用。如果沒(méi)有? --fake-initial?,初始遷移的處理方式和其他遷移沒(méi)有區(qū)別。
歷史一致性
歷史一致性前面已經(jīng)討論過(guò),當(dāng)兩個(gè)開(kāi)發(fā)分支加入時(shí),你可能需要手動(dòng)線(xiàn)性化遷移。在編輯遷移依賴(lài)關(guān)系時(shí),你可能會(huì)無(wú)意中創(chuàng)建一個(gè)不一致的歷史狀態(tài),即一個(gè)遷移已經(jīng)被應(yīng)用,但它的一些依賴(lài)關(guān)系還沒(méi)有應(yīng)用。這強(qiáng)烈地表明依賴(lài)關(guān)系不正確,所以 Django 會(huì)拒絕運(yùn)行遷移或進(jìn)行新的遷移,直到它被修復(fù)。當(dāng)使用多個(gè)數(shù)據(jù)庫(kù)時(shí),可以使用 ?database routers? 的 ?allow_migrate()? 方法來(lái)控制 ?makemigrations ?檢查哪些數(shù)據(jù)庫(kù)的歷史一致。
標(biāo)題名稱(chēng):創(chuàng)新互聯(lián)Django4.0教程:Django4.0遷移-遷移文件
文章位置:http://www.dlmjj.cn/article/djiepcs.html


咨詢(xún)
建站咨詢(xún)
