如何在不重启服务器的情况下删除Django模型文件并触发迁移?

问题描述 投票:0回答:1

我正在开发一个 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')
python django django-models
1个回答
0
投票

我正在开发一个 Django 应用程序,我需要以编程方式删除模型文件(例如 my_app/models/my_model.py),然后运行迁移,所有这些都无需重新启动服务器。

即使这会以某种方式起作用,我也会“强烈”建议不要这样做。它会产生各种副作用。动态加载模块会有各种警告,例如,如果您加载: from myapp.models import MyModel

然后的想法是,即使模块发生更改,您也可以引用 
MyModel

类对象。最好的情况是,如果您更改

MyModel
模块中的
myapp.models
类,它将使用新行打印回溯,从而产生大量噪音。
事实上,有时这种行为是需要的。 

猴子修补 [wiki],例如,您可以获取对旧类的引用,然后在模块中“注入”一个新类,但仍然有对旧文件的引用。 更新服务器时,我建议使用第二个 Django/gunicorn 应用程序,这样您就可以从新模块开始。然后将其设置为运行,最后将“路由”(例如通过

nginx

)从第一个服务器更改为第二个服务器,这样从现在开始,请求将被路由到新服务器。

© www.soinside.com 2019 - 2024. All rights reserved.