Flask SQLAlchemy:如何扩展基础Model类?

Mat*_*sen 4 python sqlalchemy flask

在Flask/SQLAlchemy中,我们使用Modelfrom flask_sqlalchemy而不是from 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)
Run Code Online (Sandbox Code Playgroud)

我有一个函数,我添加到我定义的每个模型.我想扩展一些基类并在那里添加函数,所以我不必重复自己.使用普通的SQLAlchemy,我们可以扩展声明性基类来执行此操作.我们怎样才能做到这一点flask_sqlalchemy

db.Model如果没有提高,从课堂上扩展是行不通的:

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

Man*_*cob 9

您可以通过设置来修复错误__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)
Run Code Online (Sandbox Code Playgroud)

__abstract__文档中描述.或者,您可以使用mixin类.

需要更多代码,您还可以通过子类化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)
Run Code Online (Sandbox Code Playgroud)

然后继承db.Model"像往常一样".