在python中有与php的$$变量类似的语法吗?我实际上尝试的是基于值加载模型。
例如,如果值为Song,我想导入Song模块。 我知道我可以使用if语句或lambada,但类似于php的$$变量将会非常方便。
我所追求的是类似的东西。
from mypackage.models import [*variable]
然后在视图中
def xyz(request):
xz = [*variable].objects.all()
*变量是在设置中定义的值,或者可以来自comandline。它可以是项目中的任何模型。
答案 0 :(得分:3)
def load_module_attr (path):
modname, attr = path.rsplit ('.', 1)
mod = __import__ (modname, {}, {}, [attr])
return getattr (mod, attr)
def my_view (request):
model_name = "myapp.models.Song" # Get from command line, user, wherever
model = load_module_attr (model_name)
print model.objects.all()
答案 1 :(得分:1)
我很确定你想要__import__()
。
阅读本文:docs.python.org: __import__
import函数调用此函数。它可以被替换(通过导入builtins模块并分配给
builtins.__import__
)以更改import语句的语义,但是现在使用导入钩子通常更简单(参见PEP 302
)。直接使用__import__()
的情况很少见,除非您要导入名称仅在运行时已知的模块。
答案 2 :(得分:1)
您似乎想要加载所有可能匹配的模块/模型,并根据请求选择要使用的特定模块/模型。你可以“globals()”返回全局级变量的字典,可以通过字符串索引。所以如果你做一些像globals()['Song']的东西,它会给你一个Song模型。这很像PHP的$$,除了它只会抓取全局范围的变量。对于本地范围,您必须调用locals()。
这是一些示例代码。
from models import Song, Lyrics, Composers, BlaBla
def xyz(request):
try:
modelname = get_model_name_somehow(request):
model =globals()[modelname]
model.objects.all()
except KeyError:
pass # Model/Module not loaded ... handle it the way you want to
答案 3 :(得分:0)