根據創建Django遷移時的django文檔,我們應該使用apps.get_model()而不是導入模型並使用它們。爲什麼在創建數據遷移時使用apps.get_model()?
爲什麼數據遷移必須使用一個模型,而不是最新一期的歷史版本?(該模型的歷史版本將不會在使用反正吧?)
根據創建Django遷移時的django文檔,我們應該使用apps.get_model()而不是導入模型並使用它們。爲什麼在創建數據遷移時使用apps.get_model()?
爲什麼數據遷移必須使用一個模型,而不是最新一期的歷史版本?(該模型的歷史版本將不會在使用反正吧?)
它使用的歷史版本該模型以便在您針對另一個數據庫運行遷移時嘗試訪問代碼庫中不再存在的字段時不會出現問題。
如果您從模型中刪除了某個字段,然後想要在某個新數據庫上運行遷移,並且您直接導入了模型,則可以預期遷移會嘗試使用不存在的字段。當使用apps.get_model(...)
時,Django會嘗試做出明智的決定,並使用您的遷移文件中的migrations.AddField(...)
的定義在當時爲您提供正確的模型版本。
這也是爲什麼Django說在數據遷移中使用自定義模型/模型管理器方法時要小心,因爲我不相信他們可以從遷移歷史記錄中重新創建這些方法,或者行爲可能會隨着時間而改變,您的遷移將不一致。
考慮這一模式:
class A(models.Model):
field1 = models.PositiveIntegerField()
field2 = models.PositiveIntegerField()
你的遷移歷史知道這兩個領域,任何進一步的遷移會考慮這個模型的狀態,並會改變這種模式的狀態。
現在你想刪除字段1和模型變爲:
class A(models.Model):
field2 = models.PositiveIntegerField()
而在你的遷移,您嘗試使用字段1,Django的應該知道,FIELD1存在。因此,當我們使用apps.get_model()
時,它有助於Django使用先前的遷移歷史並推斷field1。 Otheriwse你會得到一個錯誤。
(編輯:固定在回答錯字)
如果我在一個模型中刪除字段,我希望我的移民只注重存在的領域,而不是刪除領域。所以當django抱怨說我正在嘗試使用一個不存在的字段時,我們希望django能夠正確投訴嗎? – user3282666
Django可能會談論6個月前完成的模型完全不同的數據遷移,但數據遷移仍然需要與6個月前的工作相同。它不應該抱怨當前模型中缺少一個字段,因爲數據遷移不是針對當前模型設計的,而是爲您的模型的特定版本設計的。 – ARJMP
謝謝!如此愚蠢,我無法想象這種情況 – user3282666