12

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

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

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

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

4

2 回答 2

24
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.py可以moo.pymeta.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
于 2012-04-27T15:03:36.477 回答
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)
于 2012-04-27T10:40:48.017 回答