我如何拆分models.py成不同的文件在金字塔不同型号?(How do I split model

2019-06-24 00:50发布

我是新来的金字塔和一直在努力做一些改变我的项目。 我想我的模型/类分成单独的文件,而不是一个单一的models.py文件。 为了做到这一点我已删除了旧models.py并创建了一个模型文件夹__init__.py一个文件为每个类沿文件。 在__init__.py我用导入的类from .Foo import Foo

这使得视图正确工作,他们可以初始化的对象。

但在运行initializedb脚本,因为它没有当我在一个models.py所有型号不创建新表。 它不会创建相关的表,但直接试图以它们插入。

谁能给我这有不同的文件模型金字塔项目结构的例子吗?

Answer 1:

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


Answer 2:

我有同样的问题一次。

对于splited模型文件求解:你必须单独初始化从文件中的所有基地(父)类:

#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)


文章来源: How do I split models.py into different files for different models in Pyramid?