【问题标题】:Dynamically generate import in Python, specifically for a Django model在 Python 中动态生成导入,专门针对 Django 模型
【发布时间】: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__,有点难看,但是你去吧

标签: python database django schema models


【解决方案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)
猜你喜欢
  • 2011-02-03
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2012-05-21
相关资源
最近更新 更多