99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Django4.0 遷移-遷移文件

2022-03-16 17:50 更新

遷移以磁盤格式存儲(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()

初始遷移

Migration.initial

應(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ù)庫的歷史一致。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)