我认为在最近版本的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