victor_usachev
@victor_usachev
Python Dev

Как в пакете наследоваться от db.Model, определённого в приложении?

Здравствуйте, друзья.
Описываю на 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)

Простите, если спрашиваю банальные вещи, опыта мало.
Искал много, вероятно, мыслю "не туда".
  • Вопрос задан
  • 730 просмотров
Решения вопроса 1
@n4nn31355
А можете объяснить адекватную причину, почему экземпляр БД должен создаваться в приложении?
Если работа с моделями ведётся в отдельном пакете, то вполне логично там же объявлять и экземпляр БД. Так и целостность не нарушится реши вы, например, подключить пакет к приложению, в котором в качестве основной ОРМ используется что-то отличное от Flask-SQLAlchemy. Т.е. от самого приложения зависеть он не будет:

project/app/__init__.py:
from flask import Flask
from components.role.models import db
# ...
def create_app(config_name):
    app = Flask(__name__)
    # ...
    db.init_app(app)
    return app


project/components/role/models.py:
from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Base(db.Model):
   pass
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы