2012-04-27 81 views
9

我是金字塔新手,一直在努力對我的項目進行一些更改。我試圖將我的模型/類分成單個文件而不是單個models.py文件。爲了做到這一點,我已經刪除了舊的models.py,並創建了一個帶有__init__.py文件的模型文件夾以及每個類的一個文件。在__init__.py我通過使用from .Foo import Foo導入了這個類。如何將models.py分割成金字塔中不同模型的不同文件?

這使視圖正常工作,他們可以初始化一個對象。

但是運行initializedb腳本不會創建新表格,就像我在單個models.py中擁有所有模型時一樣。它不創建相關的表格,但直接嘗試插入它們。

任何人都可以給我一個金字塔項目結構的例子,其中模型在不同的文件?

回答

20
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 
+0

感謝您的回答!我很想知道爲什麼我們需要所有模型中的相同Base對象。我認爲Base會是一些靜態/共享對象,無論從哪裏調用,都可以獲取所有元數據。 – KaranK 2012-04-27 19:18:01

+0

您不需要相同的基礎或元數據,但它肯定有助於保持清晰。每個數據庫引擎應該有一個描述該引擎模式的元數據對象。在python中,只有在導入模塊時纔會執行模塊,所以當您將models.py分解爲多個單獨的模塊時,它們將不會被拾取,直到每個模塊都被導入爲止。 – 2012-04-27 20:46:30

0

我曾經有同樣的問題。

爲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) 
+1

不知道它去的最佳途徑。我寧願試圖在每個模型文件中導入Base。 – 2012-04-27 13:36:21

+0

@Antoine:我認爲'from project.models.Foo import Base as FooBase'意味着每個模型文件都有一個Base。我已經這樣做了,但它不起作用。 @Vitali:你知道爲什麼我們必須以迂迴的方式去做這件事,爲每個模型創建單獨的基礎? – KaranK 2012-04-27 14:42:29

+0

@KaranK:我的建議是在一個文件中有一個'Base',並在每個模型文件中導入'Base'。如果您使用不同的基地,我不確定這些關係是否有效。 – 2012-04-27 14:50:03

相關問題