【问题标题】:What is the proper way to define the collection name at the application startup with MongoEngine?使用 MongoEngine 在应用程序启动时定义集合名称的正确方法是什么?
【发布时间】:2019-12-20 15:06:18
【问题描述】:

我在我的 Flask 应用程序中使用 MongoEngine 作为 ODM。根据传递的配置文档,MongoEngine 应该使用不同的集合。

目前我通过更改内部元变量model._meta['collection'] 来实现这一点。有没有其他选择收藏的方法?

from mongoengine import connect
from api_service.model import MyModel


create_app(config):

app = Flask(__name__)

# load app.config 

connect(app.config['MONGODB_DB'],
        host=app.config['MONGODB_HOST'],
        port=app.config['MONGODB_PORT'],
        username=app.config['MONGODB_USERNAME'],
        password=app.config['MONGODB_PASSWORD'],
        )



MyModel._meta['collection'] = app.config['MONGODB_MYMODEL_COLLECTION']

我知道您可以在模型的类主体中通过meta:{} 定义集合(参见here)。但我不在应用程序上下文中,因此无法访问“app.config”。

【问题讨论】:

    标签: python flask flask-mongoengine


    【解决方案1】:

    您可以简单地修改类本身内部的meta 属性

    class MyModel(Document):
        meta = {"collection": "my_actual_collection_name"}
        ...
    
    

    Check This for more meta attributes you can use


    解决方案更新

    我定义了一个帮助类,它可以提供对应用程序配置的访问权限

    class AppConfigHelper:
        from flask import current_app
        APP_CONFIG = current_app.config
    

    并在文档中导入并使用该类来获取集合名称。

    class MyModel(Document):
        meta = {'collection': AppConfigHelper.APP_CONFIG['MONGODB_MYMODEL_COLLECTION']}
        ...
    

    这不是我能想到的最佳解决方案,但确实可以。


    警告:如果你将它与Flask分开运行,这将不起作用,它会崩溃,你可以在应用程序内部运行它,或使用flask shell

    【讨论】:

    • 请阅读我的问题的最后两行。我在我的问题中排除了您的建议,因为我不在模型类的应用程序上下文中。我需要在应用程序上下文中,因为我想从app.config 读取数据库集合名称。您对这种方法有什么建议吗?
    • @Mol1narius 对此感到抱歉,我将尝试更改我的代码,看看我将如何处理这种情况。
    • 当我在模块中导入我的模型时,会生成一个运行时错误,因为它不是我在应用程序上下文之外调用当前应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2010-11-10
    • 2019-03-28
    • 2012-12-19
    • 2015-07-30
    相关资源
    最近更新 更多