日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
創(chuàng)新互聯(lián)Django4.0教程:Django4.0遷移-遷移文件

遷移以磁盤(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