Flask动态模型疑问:能否使用变量指代模型?
在Flask中用变量指代SQLAlchemy模型的正确方法
你遇到的问题根源是:你把模型名存成了字符串'Cms',但query是SQLAlchemy模型类的专属属性,字符串对象根本没有这个属性,所以才会抛出AttributeError: 'str' object has no attribute 'query'。
下面是几种可行的解决方式:
直接引用模型类(最推荐)
不要用字符串存储模型名,直接把模型类本身赋值给变量:# 先从你的模型文件中导入Cms类 from app.models import Cms table = Cms # 现在可以正常调用query方法 results = table.query.all()通过字符串映射获取模型类
如果业务场景必须通过字符串来指定模型,可以自己维护一个模型名称与类的映射字典:from app.models import Cms, User, Article # 建立模型名到类的映射 model_mapping = { 'Cms': Cms, 'User': User, 'Article': Article } table_name = 'Cms' # 从映射中获取模型类 target_model = model_mapping.get(table_name) if target_model: results = target_model.query.all() else: print(f"不存在名为 {table_name} 的模型")从SQLAlchemy元数据中查找模型
如果你使用Flask-SQLAlchemy,所有注册的模型会被存在内部的注册表中,可以通过这个方式获取:from app import db # 导入你的SQLAlchemy实例 table_name = 'Cms' # 通过_decl_class_registry获取模型类 target_model = db.Model._decl_class_registry.get(table_name) if target_model: results = target_model.query.all()注意:
_decl_class_registry是SQLAlchemy的内部属性,未来版本可能有变动,所以更推荐自己维护映射字典的方式。
内容的提问来源于stack exchange,提问作者user15106307
相关产品推荐
相关产品推荐

