Las columnas de fecha y hora de SQLAlchemy se devolvieron como InstrumentedAttribute

No estoy seguro de lo que estoy haciendo mal. He leído en otras preguntas que InstrumentedAttribute tiene algo que ver con una relación, pero si observa mi código a continuación, start_date no es una columna de relación. Cuando trato de usar self.start_date o self.start_time en la propiedad self.start_time start_datetime() , ambos son sqlalchemy.orm.attributes.InstrumentedAttribute objetos y no puedo encontrar ninguna manera de obtener una fecha o una hora. Estoy usando Python 3.4.3, SQLAlchemy 1.0.12, psycopg2 2.6.1 y postgresql 9.3.12

 Base = declarative_base() class OnetimeReservation(Base): __tablename__ = 'OnetimeReservation' id = Column(Integer, primary_key=True, autoincrement=True) resource_id = Column(Integer, ForeignKey('Resource.id', ondelete='CASCADE', onupdate='CASCADE')) job_id = Column(Integer, nullable=True) start_date = Column(Date) start_time = Column(Time, nullable=True) duration = Column(Integer, nullable=True) date_created = Column(DateTime, server_default=text('CURRENT_TIMESTAMP')) created_by = Column(String(128), server_default=text('CURRENT_USER')) date_last_modified = Column(DateTime, server_default=text('CURRENT_TIMESTAMP'), server_onupdate=text('CURRENT_TIMESTAMP')) last_modified_by = Column(String(128), server_default=text('CURRENT_USER'), server_onupdate=text('CURRENT_USER')) resource = relationship('Resource') @hybrid_property def start_datetime(self): return datetime.combine(self.start_date, self.start_time) 

Después de una lectura más completa de los documentos con respecto a la propiedad de híbrido , creo que sé lo que está pasando. La razón por la que se llama una propiedad “híbrida” es que se puede llamar con una instancia de la clase, o la propia clase. Cuando se usa como parámetro de filtro, se llama con la propia clase y, parece que hay un bash de convertir el código a SQL. Hay una manera de proporcionar una implementación separada para @start_time.expression que se llamará con la clase. Gracias a la ayuda de todos, pude elaborar una implementación simple que parece funcionar. Aquí está el resultado:

 @hybrid_property def start_datetime(self): if not self.start_time: # start_time can be null return None return datetime.combine(self.start_date, self.start_time) @start_datetime.expression def start_datetime(cls): return cls.start_date + cls.start_time