12

私はピラミッドに不慣れで、プロジェクトにいくつかの変更を加えるのに苦労しています。モデル/クラスを単一のmodels.pyファイルではなく個々のファイルに分割しようとしています。そのために、古いmodels.pyを削除し、__init__.pyクラスごとに1つのファイルとともにファイルを含むmodelsフォルダーを作成しました。で__init__.pyクラスをインポートしましたfrom .Foo import Foo

これにより、ビューが正しく機能し、オブジェクトを初期化できます。

ただし、initializedbスクリプトを実行しても、すべてのモデルが1つの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共有BaseDBSession:を含めることができるようになりました

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
于 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 に答える