代码之家  ›  专栏  ›  技术社区  ›  sebpiq

在“models.py”之外的其他地方声明模型并动态

  •  1
  • sebpiq  · 技术社区  · 14 年前

    我有一个应用程序可以将模型分割成不同的文件。

    实际上,文件夹看起来像:

    >myapp
        __init__.py
        models.py
        >hooks
            ...
        ...
    

    myapp 不在乎里面有什么 hooks ,文件夹,除了存在模型,而且必须以某种方式导入这些模型,并由同步数据库安装。所以,我把这个放进去了 myapp.__init__.py :

    from django.conf import settings
    
    for hook in settings.HOOKS :
        try :
            __import__(hook)
        except ImportError as e :
            print "Got import err !", e
    #where settings.HOOKS = ("myapp.hooks.a_super_hook1", ...) 
    

    为了使此代码工作,中的模型 钩子

    class Meta:
        app_label="my_app"
    

    问题是我跑步时它不工作 syncdb

    所以我先后尝试了:

    1)

    for hook in settings.HOOKS :
        try :
            exec ("from %s import *" % hook)
    

    ->也不工作:SyncDB不在中安装模型 钩子

    2)

    from myapp.hooks.a_super_hook1 import *
    

    -gt; 这个工作

    3)

    exec("from myapp.hooks.a_super_hook1 import *")
    

    -gt; 这是为了

    所以我在测试中检查过 1) ,执行的语句与测试中的语句相同 2) 3) 和…完全一样…

    知道吗????

    编辑: 问题可以概括为:

    我声明了“models.py”之外的模型,将导入代码放在哪里,以便 小精灵 找到模型?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Gregor Müllegger    14 年前

    Django知道在项目中的任何地方定义的所有模型,所以您只需要确保定义它们的代码得到执行。这通常在导入定义模型的模块时发生。

    另一件重要的事情是 app_label 的属性 Meta 模型中的类需要设置为应用程序的包名称( myapp 在您的示例中)。这是必要的,因为 syncdb 将仅从数据库中列出的应用程序安装模型。 INSTALLED_APPS 设置。

    关于问题中描述的设置,您需要:

    1. 确保导入定义模型的模块
    2. 设置 应用程序标签 模型中的属性 类到 迈阿普
    3. 迈阿普 进入你的 已安装的应用程序 设置

    其他信息: 另一个要求是在德姜制作 同步CDB 在你的模型上工作是,定义模型的应用程序 应用程序标签 设置为)需要 models.py 即使文件为空。但正如您问题中所描述的,您已经有了这个文件。

        2
  •  0
  •   sebpiq    14 年前

    好啊。。。我有这该死的东西。

    导入模型时,SyncDB尝试导入找到的内容。如果导入失败,则为 后池 以后再试试!这就是为什么:

    for hook in settings.HOOKS :
        try :
            __import__(hook)
        except ImportError as e :
            print "Got import err !", e
    

    不适用于SyncDB:因为导入错误被捕获,并且没有传输,所以模型导入将永远不会进行后处理。所以正确的代码是:

    for log_hook in settings.LOG_HOOKS :
        try :
            __import__(log_hook)
        except ImportError as e :
            raise e
    

    这个 try... except 在这种情况下可能是无用的。

        3
  •  -1
  •   Nanda Kishore    14 年前

    假设您有一个名为 users_models.py 在里面 hooks 文件夹:

    你可以说 from hooks.users_models import * 在里面 myapp.__init__.py 正确的?那将由 syncdb 当然。