在 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/