Здравствуйте, друзья.
Описываю на python предметную область, вынес классы основных бизнес-объектов в отдельный пакет.
В качестве ORM - SQLAlchemy, классы должны наследоваться от db.Model, но о конкретном экземпляре db они ничего знать не должны. Доп. сложность в том, что db.Model - экземпляр, а не класс.
Вопрос: как в пакете наследоваться от db.Model, если db определён в приложении?
Пакет должен быть независим от самого приложения, но всегда предполагается наследование от какого-нибудь anydb.Model, где db объявляется в конкретном приложении. Ниже пример as-is.
project/app/__init__.py:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# ...
def create_app(config_name):
app = Flask(__name__)
# ...
db.init_app(app)
return app
project/components/role/models.py:
from app import db
class Base(db.Model):
"""Basic class for all classes which to presents as database tables"""
__abstract__ = True
id = db.Column(db.Integer, primary_key=True)
date_created = db.Column(db.DateTime, default=db.func.current_timestamp())
date_modified = db.Column(db.DateTime, default=db.func.current_timestamp(),
onupdate=db.func.current_timestamp())
class Role(Base):
__tablename__ = 'role'
name = db.Column(db.String(64), unique=True, index=True)
default = db.Column(db.Boolean, default=False, index=True)
mask = db.Column(db.Integer, default=0)
и где-то в коде приложения этот класс используется, например:
user.role = Role.query.get(form.role.data)
Простите, если спрашиваю банальные вещи, опыта мало.
Искал много, вероятно, мыслю "не туда".