python - flask SQLAlchemy : How to extend the base Model class?

标签 python flask sqlalchemy

在 Flask/SQLAlchemy 中,我们使用 flask_sqlalchemy 中的 Model 类而不是 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: Class does not have a table or tablename specified and does not inherit from an existing table-mapped class.

最佳答案

您可以通过设置 __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 进行子类化。

关于python - flask SQLAlchemy : How to extend the base Model class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37515794/

相关文章:

python - 在 JSON 序列化/反序列化过程中转换标识符命名在驼峰式和下划线之间

Python 3.5 setup.py egg_info 失败,错误代码为 1 [Linux]

python - 防止脚本滥用 Web 应用程序的最简单方法?

Python Flask 和 SQLAlchemy,从列中选择所有数据

java - 最接近于 Java/Scala 的 SQLAlchemy

python - 将名称添加到 numpy 数组

javascript - django/backbone.js 中的 CSRF 验证失败

python - 既然 Celery 4 已经放弃了 Windows 支持,那么 Windows 上的(Python 3)任务队列的最佳选择是什么?

python - wtforms+flask 今天的日期作为默认值

python - 如何替换sqlalchemy查询中的列