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没有指定表或表名,也不从现有的表映射类继承.
您可以通过设置来修复错误__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"像往常一样".
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |