2015-11-15 73 views
1

在生產服務器上的Django應用程序我以這種方式在服務器上運行的遷移:防止FieldDoesNotExist遷移

  1. 上傳models.py文件服務器與一些新的領域sfield IM模式Mobject
  2. 在執行makemigration命令manage.py
  3. 在manage.py中執行migrate命令 但是,在第一步結束和第三步結束之間有一些請求失敗,並且出現了django.core.exceptions.FieldDoesNotExist: Mobject has no field named 'sfield'(這很明顯,因爲django ORM無法從DB獲取此字段但已經在Cla的領域ss,所以django會嘗試去做)

是否有可能使所有3個步驟「原子」?或globaly忽略這個例外,因爲現在我不需要sfield,我只想執行沒有例外的遷移。或者可能是我可以用某種方式臨時標記新字段以阻止django從數據庫中獲取它,但是它必須對makemigrations/migrate可見?

回答

1

如果你做select * from yourtable然後Django試圖獲取模型中定義的所有字段。

您可以使用您的ORM only()選擇特定的領域,所以沒有異常將同時遷移不是在ORM使用尚未

順便說一句新的領域得到提升,你應該在本地創建遷移文件,測試新字段,然後將遷移文件提交給服務器。在部署服務器時,您只需在部署後立即使用migrate,這樣可以縮短髮生異常的時間。

從Django文檔:

,有單獨的命令做出和應用 遷移是因爲你承諾遷移到版本控制系統 與您的應用程序附帶他們的原因;它們不僅使您的開發更容易,而且其他開發人員也可以使用,也可以使用 生產。

+1

謝謝,是的,我同意 - 本地開發服務器是創建遷移的正確方法,但正如您提到的那樣,它不會解決問題,它會將服務器遷移步驟減少到2:'Upload'和'migrate',但仍然一些請求可能會失敗。只有有趣的事情,多虧你的堅定,我也發現'延期',我也會嘗試。 – user3479125

+0

@ user3479125不錯,祝你好運! ;) – doniyor