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

Kar*_*ran 11 python model-view-controller pyramid

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

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

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

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

Mic*_*kel 23

myapp
    __init__.py
    scripts
        __init__.py
        initialize_db.py
    models
        __init__.py
        meta.py
        foo.py
        moo.py
Run Code Online (Sandbox Code Playgroud)

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

Base = declarative_base()
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension))
Run Code Online (Sandbox Code Playgroud)

每个foo.pymoo.py可以导入从他们共同的基础meta.py.

from .meta import Base

class Foo(Base):
    pass
Run Code Online (Sandbox Code Playgroud)

要确保从models子包中拾取所有表,并且为了方便起见,您可以将它们导入models/__init__.py:

from .meta import DBSession
from .foo import Foo
from .moo import Moo
Run Code Online (Sandbox Code Playgroud)

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

initialize_db然后,您的脚本可以通过创建所有表

from myapp.models.meta import Base
Base.metadata.create_all(bind=engine)
Run Code Online (Sandbox Code Playgroud)

您的视图可以导入模型以获利:

from myapp.models import DBSession
from myapp.models import Foo
Run Code Online (Sandbox Code Playgroud)