Форум сайта python.su
Всем здравствуйте!
Пишу сохранение истории изменения значений атрибутов модели алхимии. Перечень атрибутов, которые важны для истории, сохраняю в атрибуте класса history_attributes, при этом в целях удобства рефакторинга использую не строковые названия атрибутов, а сами дескрипторы.
from sqlalchemy import Integer, Column, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class HistoryAttribute: def __init__(self, descriptor, display_name, use_message=False): self.name = descriptor.name self.display_name = display_name self.use_message = use_message class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) first_name = Column(String(100)) email = Column(String(100)) history_attributes = ( HistoryAttribute(descriptor=first_name, display_name='User name'), email ) print(User.history_attributes[0].name) >>> None print(User.history_attributes[1].name) >>> email
Отредактировано Stright (Июнь 14, 2017 00:18:39)
Офлайн
А у него в этот момент еще не установлено значение для name. Оно появляется после цепочки
DeclarativeMeta.__init__
_as_declarative
_MapperConfig.setup_mapping
_MapperConfig.__init__
_extract_declared_columns
_undefer_column_name - вот тут имя атрибута класса отдается в дескриптор.
А экземпляр HistoryAttribute инициализируется до вызова DeclarativeMeta.__init__. Можно вот так
class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) first_name = Column(String(100)) email = Column(String(100)) User.history_attributes = ( HistoryAttribute(descriptor=User.first_name, display_name='User name'), User.email )
Отредактировано PooH (Июнь 15, 2017 06:16:46)
Офлайн
Спасибо большое за помощь и подробный ответ! Примерно то же самое мне ответили на stackoverflow, оставил такой вариант:
class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) first_name = Column(String(100)) email = Column(String(100)) @classmethod def get_history_attributes(cls): return ( HistoryAttribute(descriptor=cls.first_name, display_name='User name'), cls.email )
Отредактировано Stright (Июнь 15, 2017 09:56:52)
Офлайн