我使用的是Turbogears 2.3.11。我有1个应用程序和2个TurboGears可插拔应用程序。在Pluggable Applications中有自己的模型。 如何从两个可插拔应用程序中调用一个可插拔应用程序中的模型?
例如:
- mainapp
-- model
--- __init__.py
--- auth.py
- plugapp_one
-- model
--- __init__.py
--- models.py
---- Book
- plugapp_two
-- model
--- __init__.py
--- models.py
---- Buyer
---- Card
在Book对象的Card Object调用关系中,我使用了app_model.Book。它错误
AttributeError: 'module' object has no attribute 'Book'
我在plugapp_two的models.py中的代码
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 :(得分:0)
您有两种选择:
在插件时显式提供模型,通常采用package.module:Model
之类的形式。就像tgapp-resetpassword的形式一样:https://github.com/axant/tgapp-resetpassword#plugin-options。然后,只要您需要访问该模型,就可以访问那里指定的模型。困难的是你必须确保访问该模型的每个地方都懒散地访问它,或者你可能最终在配置它之前尝试使用它。请参阅LazyForeignKey
https://github.com/TurboGears/tgext.pluggable#relations-with-plugged-apps-models
选项1肯定是最灵活的,因为您选择在插件时关联哪个型号,但如果您使用可插拔应用程序只是为了拆分您自己的应用程序而不打算重复使用它们,您可以只需使用global_models=True
选项将它们全部插入即可,可插拔应用中的所有模型最终都会在tgext.pluggable.app_model.Model
中显示。
请注意,两种解决方案都需要注意 时访问模型,因为它可能尚未插入。您应该尝试通过LazyForeignKey
和relationship
使用lambdas尽可能地延迟模型使用,这样模型仅在实际需要时使用。或者您最终可能会在插入之前尝试访问它。