Функция declarative_mixin
Функция declarative_mixin создает специальный
базовый класс, который позволяет выносить общие
колонки, связи и методы в отдельный миксин.
Первый параметр принимает имя класса. В отличие от
обычного наследования, миксин не создает
отдельную таблицу, а его атрибуты встраиваются
в таблицы дочерних моделей.
Синтаксис
declarative_mixin(cls)
Пример
Давайте создадим простой миксин с общими полями для статей и пользователей:
from sqlalchemy import create_engine, String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, declarative_mixin
engine = create_engine('sqlite:///:memory:')
@declarative_mixin
class TimestampMixin:
created_at: Mapped[str] = mapped_column(String, default='now')
class Base(DeclarativeBase):
pass
class Article(TimestampMixin, Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
print(Article.__table__.columns.keys())
Результат выполнения кода:
['id', 'title', 'created_at']
Пример
Давайте добавим в миксин не только колонки, но и общие методы для работы с объектами:
from sqlalchemy import create_engine, String, Integer
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, declarative_mixin, Session
engine = create_engine('sqlite:///:memory:')
@declarative_mixin
class ReprMixin:
def __repr__(self):
return f"<{self.__class__.__name__}(title={self.title!r})>"
class Base(DeclarativeBase):
pass
class Article(ReprMixin, Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article 1')
session.add(article)
session.commit()
print(article)
Результат выполнения кода:
"<Article(title='article 1')>"
Смотрите также
-
класс
DeclarativeBase,
который представляет базовый класс для моделей -
функцию
declared_attr,
которая позволяет создавать динамические атрибуты в миксинах -
функцию
declarative_base,
которая создает базовый класс декларативной модели -
класс
Mapped,
который используется для аннотации типов колонок