2017-08-08 27 views
0

我用Turbogears 2.3.11。 TurboGears有1個應用程序和2個可插入應用程序。在可插入的應用程序中有自己的模型。 如何從兩個可插入應用程序在一個可插入應用程序中調用模型?如何調用外部關係模型可插入其他模型可插入turbogears 2.3.11中?

在例如:

- mainapp 
    -- model 
    --- __init__.py 
    --- auth.py 
- plugapp_one 
    -- model 
    --- __init__.py 
    --- models.py 
     ---- Book 
- plugapp_two 
    -- model 
    --- __init__.py 
    --- models.py 
     ---- Buyer 
     ---- Card 

在卡對象調用關係到Book對象,我用app_model.Book。它錯誤

AttributeError: 'module' object has no attribute 'Book' 

我的代碼在plugapp_two

from tgext.pluggable import app_model, primary_key 

class Card(DeclarativeBase): 
    __tablename__ = 'card' 
    uid = Column(Integer, autoincrement=True, primary_key=True) 
    name = Column(Unicode(16)) 
    id_book = Column(Integer, ForeignKey(primary_key(app_model.Book))) 
    book = relation(app_model.Book) 

回答

0

的models.py你有兩個選擇:

  1. 明確規定在塞時間模型,通常像package.module:Model形式。很像tgapp-resetpassword的形式:https://github.com/axant/tgapp-resetpassword#plugin-options。然後,無論您需要訪問該模型,您都可以訪問該模型中指定的那個模型。難題在於您必須確保訪問該模型的每個地方都會懶惰地訪問它,否則最終可能會在配置之前嘗試使用它。見任你選擇哪個型號的插件時間與LazyForeignKeyhttps://github.com/TurboGears/tgext.pluggable#relations-with-plugged-apps-models

  2. 方案1無疑是最靈活的,但如果你正在使用可插拔應用程序只拆分自己的應用程序,並且不打算重用他們,你可以只需使用global_models=True選項將它們全部插入即可,並且可插拔應用程序的所有型號最終都可在tgext.pluggable.app_model.Model中使用。

注意,這兩個解決方案需要注意您訪問的模式,因爲它可能還沒有被堵塞。您應儘量通過LazyForeignKeyrelationship使用lambda表達式儘可能延遲模型使用,以便僅在實際需要時才使用模型。或者您可能最終嘗試在插入之前訪問它。

+0

謝謝你的信息。 – padungrat