我不确定我做错了什么。我已经读过其他问题,InstrumentedAttribute与关系有关,但是如果你查看下面的代码,start_date
不是关系列。当我尝试在self.start_date
属性中使用self.start_time
或start_datetime()
时,它们都是sqlalchemy.orm.attributes.InstrumentedAttribute
个对象,我无法找到任何方式来获取日期或时间。我使用的是Python 3.4.3,SQLAlchemy 1.0.12,psycopg2 2.6.1和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)
答案 0 :(得分:0)
在更全面地阅读the docs regarding hybrid_property之后,我想我知道发生了什么。它被称为“混合”属性的原因是可以使用类的实例或类本身来调用它。当用作过滤器参数时,它将使用类本身进行调用,并且似乎尝试将代码转换为SQL。有一种方法可以为@start_time.expression
提供一个单独的实现,它将被类调用。感谢大家的帮助,我能够找到一个似乎有用的简单实现。结果如下:
@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