我認爲在最近版本的Django中有一個簡單的答案,但我無法找到它。Django:在每次啓動時運行代碼,但在數據庫遷移後運行代碼
我有接觸數據庫的代碼。每次Django啓動時我都希望它運行。我似乎有兩個選擇:
選項1.AppConfig.ready()
- 這工作,但數據庫中創建表之前也運行(即在測試過程中或重新初始化沒有數據的應用程序時)。如果我用這個我必須趕上多種類型的異常和猜測的原因是空的DB:
def is_db_init_error(e, table_name):
return ("{}' doesn't exist".format(table_name) in str(e) or
"no such table: {}".format(table_name) in str(e)
)
try:
# doing stuff
except Exception as e:
if not is_db_init_error(e, 'foo'):
raise
else:
logger.warn("Skipping updating Foo object as db table doesn't exist")
選項2使用post_migrate.connect(foo_init, sender=self)
- 但這只是跑的時候我做了遷移。
選項3舊的方式 - 從urls.py
稱之爲 - 我想保持這樣的東西出來urls.py
,我想AppConfig
是一個真實路徑
我爲選項2迄今爲止落戶 - 我不喜歡臭的嘗試/除了選項1和選項3的東西之外,我錯誤地將urls.py
變成了垃圾場。
但是,當我在本地開發時,選項2經常讓我出行 - 我需要記住在我希望運行init代碼時運行遷移。像拉下生產數據庫或類似的東西通常會導致問題,因爲不會觸發遷移。
我還沒有嘗試過這個自己,但是你可以重寫manage.py文件 – dentemm