我正在开发一个 Django 应用程序,我需要以编程方式删除模型文件(例如,my_app/models/my_model.py),然后运行迁移,所有这些都无需重新启动服务器。但是,删除文件并运行 makemigrations 后,Django 无法识别任何更改,也不会生成迁移来删除模型。
我尝试使用
importlib.reload()
重新加载模块,但这并没有解决问题。系统只有在我重新启动服务器后才会检测到更改。
Django 或 Python 是否在其他地方保留对模型的引用,从而阻止更改立即注册?有没有不用重启服务器就可以解决这个问题的方法?
file_path = 'my_app/models/my_model.py'
if os.path.exists(file_path):
os.remove(file_path)
#Update __init__.py
init_file_path = 'my_app/models/__init__.py'
with open(init_file_path, 'r') as file:
lines = file.readlines()
with open(init_file_path, 'w') as file:
for line in lines:
if 'my_model' not in line:
file.write(line)
module_name = 'my_app.models'
if module_name in sys.modules:
del sys.modules[module_name]
module = importlib.import_module(module_name)
importlib.reload(module)
call_command('makemigrations', 'concrete_models')
call_command('migrate', 'concrete_models')
我正在开发一个 Django 应用程序,我需要以编程方式删除模型文件(例如 my_app/models/my_model.py),然后运行迁移,所有这些都无需重新启动服务器。
即使这会以某种方式起作用,我也会“强烈”建议不要这样做。它会产生各种副作用。动态加载模块会有各种警告,例如,如果您加载:
from myapp.models import MyModel
然后的想法是,即使模块发生更改,您也可以引用
MyModel
类对象。最好的情况是,如果您更改
MyModel
模块中的 myapp.models
类,它将使用新行打印回溯,从而产生大量噪音。事实上,有时这种行为是需要的。 猴子修补 [wiki],例如,您可以获取对旧类的引用,然后在模块中“注入”一个新类,但仍然有对旧文件的引用。 更新服务器时,我建议使用第二个 Django/gunicorn 应用程序,这样您就可以从新模块开始。然后将其设置为运行,最后将“路由”(例如通过
nginx)从第一个服务器更改为第二个服务器,这样从现在开始,请求将被路由到新服务器。