Метод getter класса hybrid_property
Метод getter класса hybrid_property
позволяет задать функцию, которая будет
вызываться при обращении к гибридному
свойству у экземпляра модели. Эта функция
получает объект self и возвращает
вычисленное значение. Метод используется
как декоратор и принимает первым параметром
функцию Python-уровня.
Гибридное свойство объединяет поведение
обычного Python-свойства на уровне
экземпляра и SQL-выражения на уровне
класса. Метод getter отвечает
именно за первую часть: он определяет,
как значение вычисляется в Python.
Синтаксис
@hybrid_property
def name(self):
...
@name.getter
def name(self):
...
Пример
Давайте создадим модель Article
с гибридным свойством full_title,
которое объединяет заголовок и статус:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.ext.hybrid import hybrid_property
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
status: Mapped[str]
@hybrid_property
def full_title(self):
return '[' + self.status + '] ' + self.title
@full_title.getter
def full_title(self):
return self.status.upper() + ': ' + self.title
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', status='published')
session.add(article)
session.commit()
print(article.full_title)
Результат выполнения кода:
"PUBLISHED: article"
Пример
Метод getter можно применить
к гибридному свойству, объявленному
отдельно, чтобы переопределить логику
вычисления у экземпляра:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.ext.hybrid import hybrid_property
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
text: Mapped[str]
num: Mapped[int]
@hybrid_property
def summary(self):
return self.title
@summary.getter
def summary(self):
return self.title + ' (' + str(self.num) + ')'
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', text='some text', num=5)
session.add(article)
session.commit()
print(article.summary)
Результат выполнения кода:
"article (5)"
Смотрите также
-
класс
hybrid_property,
который создает гибридное свойство -
метод
setter,
который задает функцию записи значения -
метод
expression,
который задает SQL-выражение свойства -
метод
comparator,
который настраивает сравнение свойства