У меня есть довольно сложный идентификатор объекта со структурой <datetime>#<uuid>
, который я хотел бы обрабатывать на уровне модели как свойство, поэтому его можно использовать как в качестве свойства, так и в запросах. Поскольку я поддерживаю несколько бэкэндов базы данных, мне нужна реализация c с указанием диалекта.
Пример:
from sqlalchemy import Column
from sqlalchemy_utc import UtcDateTime
from sqlalchemy_utils import UUIDType
class Message(BaseModel):
create_datetime = Column(UtcDateTime(timezone=True), nullable=False)
uuid = Column(UUIDType(binary=False), nullable=False)
@hybrid_property
def message_id(self) -> str:
return self.create_datetime.isoformat() + '#' + str(self.uuid)
# Usage patterns:
# message_id = message.message_id
# session.query(Message).filter_by(message_id=message_id)
Я пробовал hybrid_property.expression
с пользовательскими FunctionElement
и compiles
, но я не могу передать значение внутри, чтобы сделать правильный запрос.
class get_message_id(FunctionElement):
type = Text()
name = 'get_message_id' # required for some reason
@compiles(get_message_id)
def get_message_id_default(element, compiler, **kwargs):
# Now what?
class Message(BaseModel):
...
@message_id.expression
def message_id(cls):
return get_message_id()