在 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生成的下拉列表,如何选择隐藏的选项

覆盖 UWP 中的 WinSxS 机制。专门针对 ComCtl32.dll

Python30 动态导入模块/断言

python中动态导入文件的方法

如何制作一个接口匹配双精度的类,但可以专门针对哪些模板?