【发布时间】:2010-07-30 14:21:28
【问题描述】:
我有一些按应用名称进行版本控制的 django 应用。
appv1 应用v2
应用中的models.py根据版本略有不同,但型号名称相同。
我正在尝试将模型动态加载到当前命名空间中。 所以我做了一个函数来尝试获取模块并返回它:
def get_models_module(release):
release_models_path = u"project.data_%s" % (release)
_temp = __import__(release_models_path, globals(), locals(), ["models"], -1)
models = _temp.models
return models
然后我尝试从返回的模型模块中加载所有模型,但失败了。
models = get_models_module("1")
from models import *
发生这种情况时,我会收到错误消息:
ImportError: 没有名为模型的模块
我检查了返回的“models”对象列为“module 'project.data_1.models' ...”, 但显然它不喜欢被重命名。
有没有办法从特定的应用程序版本加载所有定义的模型? 或者,有没有更好的方法来处理这种情况?
注意:目前仅在加载函数中将数据导入数据库,并没有通过任何视图运行。
更新的解决方案:
感谢 Daniel Kluev 的解决方案,这是我的更新功能:
def load_release_models(release):
model_release = release.replace(u".", u"_").replace(u"-", u"d")
release_models_path = u"project.data_%s.models" % (model_release)
# import all release models into (global) namespace
exec(u"from {0} import *".format(release_models_path)) in globals()
注意 - 我正在加载全局变量,因为我需要在整个文件中访问这些模型。
【问题讨论】: