在 Python 中动态生成导入,专门针对 Django 模型
Posted
技术标签:
【中文标题】在 Python 中动态生成导入,专门针对 Django 模型【英文标题】:Dynamically generate import in Python, specifically for a Django model 【发布时间】:2012-11-01 14:14:13 【问题描述】:给定一个 django 模型,我如何为它自动生成有效的导入?我有一个严格的内部函数(只有开发人员会使用它),它接受一个模型并返回一些关于它的信息。问题是,我不知道如何动态导入东西:
例如,我的应用结构可能是:
-myproject
--books
--music
以及功能:
def my_func(Model):
from appname.models import Model
## Rest of function here ##
有没有办法可以根据模型自动生成导入?我正在考虑访问 _meta 属性以获取 app_label,但显然,需要导入才能访问 Model._meta。任何想法将不胜感激。
【问题讨论】:
Model 参数的类型是什么?如果它显然已经是模型,则无需再次导入任何内容。如果它是一个字符串,那么您需要在字符串中包含应用程序名称,否则您将不知道从哪里导入。导入函数拼写为__import__
,有点难看,但是你去吧
【参考方案1】:
我认为get_model
是您所需要的。
from django.db.models.loading import get_model
model = get_model('appname', 'ModelName')
现在你可以这样做了。
objects = model.objects.all()
【讨论】:
如何使用可变模型名称访问 appname? 这是模型所在的应用程序的名称。【参考方案2】:您可以使用importlib
动态导入模块,这允许您将包指定为第二个参数。
import importlib
mod = importlib.import_module('modulename', 'packagename')
如果你想让你的模块名称与你的模型类匹配,你可以试试这个:
ModelClass.__name__
【讨论】:
如何访问模块名称?【参考方案3】:使用__import__
函数并将模型作为字符串传入。
def my_func(Model):
modelVar = __import__("appname.models"+Model)
【讨论】:
如何访问 appname?它不会尝试从 appname 导入吗? 这将返回 appname 模块,而不是我认为的模型。 ISTR 你需要更多类似的东西__import__('appname.models', Model)
以上是关于在 Python 中动态生成导入,专门针对 Django 模型的主要内容,如果未能解决你的问题,请参考以下文章
您如何解决“未找到隐藏的导入!” pyinstaller 中针对 scipy 的警告?
selenium python 针对js生成的下拉列表,如何选择隐藏的选项