我是金字塔的新手,并且一直在努力对我的项目进行一些更改。我试图将我的模型/类拆分为单个文件而不是单个models.py文件。为了做到这一点,我删除了旧的models.py并创建了一个带有__init__.py
文件的模型文件夹以及每个类的一个文件。在__init__.py
我使用from .Foo import Foo
导入了该类。
这使视图正常工作,并且可以初始化对象。
但是运行initializedb脚本不会像我在单个models.py中拥有所有模型时那样创建新表。它不会创建相关表,而是直接尝试插入它们。
有人能给我一个金字塔项目结构的例子,它有不同文件中的模型吗?
答案 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.py
和moo.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)