gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:02:55 29 4
gpt4 key购买 nike

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

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com