【问题标题】:Flask SQLAlchemy: How to extend the base Model class?Flask SQLAlchemy:如何扩展基础模型类?
【发布时间】:2016-09-27 16:49:17
【问题描述】:

在 Flask/SQLAlchemy 中,我们使用来自 flask_sqlalchemyModel 类而不是来自 sqlalchemy 的类,如下所示:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class Foo(db.Model):
    bar = db.Column(db.String)

我有一个添加到我定义的每个模型的函数。我想扩展一些基类并在那里添加函数,所以我不必重复自己。使用普通的 SQLAlchemy,我们可以扩展声明性基类来做到这一点。我们如何在flask_sqlalchemy 中实现这一点?

如果不提升,从 db.Model 类扩展是行不通的:

InvalidRequestError:类没有指定表名,也没有从现有的表映射类继承。

【问题讨论】:

    标签: python flask sqlalchemy


    【解决方案1】:

    您可以通过设置__abstract__ = True 来修复错误。我修改了你的例子:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    db = SQLAlchemy(app)
    
    class Foo(db.Model):
        __abstract__ = True
        bar = db.Column(db.String)
    

    __abstract__the documentation 中描述。或者,您可以使用mixin class

    需要更多代码,您还可以通过继承SQLAlchemy 并覆盖其make_declarative_base() 方法来覆盖声明性基类。示例:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy, Model, _BoundDeclarativeMeta, _QueryProperty
    from sqlalchemy.ext.declarative import declarative_base
    
    app = Flask(__name__)
    
    class MyModel(Model):
        ...
    
    class MySQLAlchemy(SQLAlchemy):
        def make_declarative_base(self, metadata=None):
            base = declarative_base(cls=MyModel, name='MyModel',
                                    metadata=metadata,
                                    metaclass=_BoundDeclarativeMeta)
            base.query = _QueryProperty(self)
            return base
    
    db = MySQLAlchemy(app)
    

    然后继承db.Model“像往常一样”。

    【讨论】:

    • 我添加了另一种方法来做到这一点。我不是 SQLAlchemy 专家,所以我希望这也是正确的。
    • 这很有趣 - 很酷。我现在会坚持第一种方式。
    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 2014-05-06
    相关资源
    最近更新 更多