如何将models.py拆分为Pyramid中不同模型的不同文件?

时间:2012-04-27 06:20:00

标签: python model-view-controller pyramid

我是金字塔的新手,并且一直在努力对我的项目进行一些更改。我试图将我的模型/类拆分为单个文件而不是单个models.py文件。为了做到这一点,我删除了旧的models.py并创建了一个带有__init__.py文件的模型文件夹以及每个类的一个文件。在__init__.py我使用from .Foo import Foo导入了该类。

这使视图正常工作,并且可以初始化对象。

但是运行initializedb脚本不会像我在单个models.py中拥有所有模型时那样创建新表。它不会创建相关表,而是直接尝试插入它们。

有人能给我一个金字塔项目结构的例子,它有不同文件中的模型吗?

2 个答案:

答案 0 :(得分:23)

myapp
    __init__.py
    scripts
        __init__.py
        initialize_db.py
    models
        __init__.py
        meta.py
        foo.py
        moo.py

现在meta.py可以包含共享的Base以及DBSession

Base = declarative_base()
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension))

每个foo.pymoo.py都可以从meta.py导入其共享基础。

from .meta import Base

class Foo(Base):
    pass

要确保从models子包中提取所有表格,为方便起见,您可以将其导入models/__init__.py

from .meta import DBSession
from .foo import Foo
from .moo import Moo

如果不执行此类操作,则不会将不同的表附加到Base,因此在调用create_all时不会创建。

您的initialize_db脚本可以通过

创建所有表格
from myapp.models.meta import Base
Base.metadata.create_all(bind=engine)

您的观点可以导入模型以获利:

from myapp.models import DBSession
from myapp.models import Foo

答案 1 :(得分:0)

我曾经遇到过同样的问题。

解析拆分的模型文件:您必须分别从文件中初始化所有Base(父)类:

#initializedb.py
...
from project.models.Foo import Base as FooBase
from project.models.Moo import Base as MooBase
...

def main(argv=sys.argv):
    ...
    FooBase.metadata.create_all(engine)
    MooBase.metadata.create_all(engine)