Python 从表示24小时的24值整数列表派生状态
如果可能的话,我正试图找到一种方法来表示单个python对象中某个项的3种可用状态 我想尝试保持组合状态(24小时)与项目状态(不可用、可用和预订)的一致性 目前,我必须提取一个json字段,其中包含计划、任何可能的预订,并表示未来24小时的可用性和不可用性 第一个想法是做一个列表,其中3个状态代表24小时 带状态的24小时时钟 0不可用, 1可用(由于当前时间在计划内) 2已预订但不可用Python 从表示24小时的24值整数列表派生状态,python,postgresql,Python,Postgresql,如果可能的话,我正试图找到一种方法来表示单个python对象中某个项的3种可用状态 我想尝试保持组合状态(24小时)与项目状态(不可用、可用和预订)的一致性 目前,我必须提取一个json字段,其中包含计划、任何可能的预订,并表示未来24小时的可用性和不可用性 第一个想法是做一个列表,其中3个状态代表24小时 带状态的24小时时钟 0不可用, 1可用(由于当前时间在计划内) 2已预订但不可用 # postgres json field of a single schedule cannot be
# postgres json field of a single schedule cannot be altered
schedule = {
'availability': {
'mon': { 'start': '01:00:00', 'end': '13:00:00'},
'tue': { 'start': '01:00:00', 'end': '13:00:00'},
'wed': { 'start': '01:00:00', 'end': '13:00:00'},
'thu': { 'start': '01:00:00', 'end': '13:00:00'},
'fri': { 'start': '01:00:00', 'end': '13:00:00'},
'sat': { 'start': '01:00:00', 'end': '13:00:00'},
'sun': { 'start': '01:00:00', 'end': '13:00:00'},
}
}
# example booking
booking_today_start = datetime.datetime(2017, 4, 1, 1, 0, 0) # postgres date field
booking_today_end = datetime.datetime(2017, 4, 1, 10, 0, 0) # postgres date field
我发现这种想法很难更新列表,因为列表可能必须每小时移动和重新计算一次,以保持其状态,并且容易出错
鉴于我必须将这三个postgres字段组合成一个可用对象来表示小时和可用性的状态,有没有更好的方法在python数据结构中表示这种状态。放弃json字段,每天使用日期字段,并尝试在postgres而不是python中这样做是否更好?任何人谁可能已经解决了这个问题之前,我将感谢任何提示,甚至方向去,或者我如何才能更好地处理它,谢谢
class User(SurrogatePK, Model):
__tablename__ = 'users'
# Relationships.
reservations = db.relationship('Reservation', backref='guest', uselist=False)
addresses = db.relationship('Properties', backref='host', uselist=False)
# other user props below
class Property(SurrogatePK, Model):
__tablename__ = 'addresses'
# relationships Property.host > User
host_id = db.Column(db.Integer, db.ForeignKey('users.id',
onupdate='CASCADE',
ondelete='CASCADE'),
index=True, nullable=False)
reservations = db.relationship('Reservation',
backref='address_property', uselist=False)
#schedule
schedule = Column(JSON, nullable=True)
avail_type = Column(db.Unicode(50), nullable=True) # hourly etc
is_avail = Column(db.Boolean(), default=True)
class Reservation(SurrogatePK, Model):
__tablename__ = 'reservations'
# relationships
# Reservation.guest > User
guest_id = db.Column(db.ForeignKey('users.id',
onupdate='CASCADE', ondelete='CASCADE'),
nullable=False)
address_id = db.Column(db.ForeignKey('addresses.id', onupdate='CASCADE',
ondelete='CASCADE'), nullable=False)
status = db.Column(db.Enum('pending', 'confirmed', 'rejected',
name='reservation_status_enum'), default='confirmed')
reserve_start = db.Column(db.DateTime)
reserve_end = db.Column(db.DateTime)
@classmethod
def _time_in_range(self, x):
if self.reserve_start <= self.reserve_end:
return self.reserve_start <= x <= self.reserve_end
else:
return self.start <= x or x <= self.reserve_end
类用户(代理程序,模型):
__tablename_uu='users'
#关系。
预订=数据库关系('Reservation',backref='guest',uselist=False)
地址=db.relationship('Properties',backref='host',uselist=False)
#其他用户道具如下
类属性(代理步骤、模型):
__tablename_uu='地址'
#关系属性.host>用户
host_id=db.Column(db.Integer,db.ForeignKey('users.id'),
onupdate='CASCADE',
ondelete='CASCADE'),
索引=真,可空=假)
保留=数据库关系(“保留”,
backref='address\u property',uselist=False)
#时间表
schedule=Column(JSON,nullable=True)
avail_type=Column(db.Unicode(50),nullable=True)等
is_avail=Column(db.Boolean(),默认值=True)
班级预订(代理台,型号):
__tablename_uuu='reservations'
#关系
#Reservation.guest>User
guest_id=db.Column(db.ForeignKey('users.id'),
onupdate='CASCADE',ondelete='CASCADE'),
可空=假)
address\u id=db.Column(db.ForeignKey('addresses.id',onupdate='CASCADE',
ondelete='CASCADE'),null=False)
status=db.Column(db.Enum('pending','confirm','rejected',',
name='reservation\u status\u enum'),默认值='confirm')
reserve\u start=db.Column(db.DateTime)
reserve_end=db.Column(db.DateTime)
@类方法
定义时间在定义范围内(自身,x):
如果self.reserve\u start您的解决方案很好,因为它可以很快找到“在这个特定的时间段是否可用”,但它不能支持17:30-20:45这样的范围,您必须进行一些额外的计算,以询问“它在04:15可用吗?”
相反,我建议做与Postgres数据库相同的事情:存储每周每天的开始和结束时间。使用datetime.time
对象。比较很简单,选择一周中合适的一天,并检查start\u time为什么它必须是一个单一的对象?它不一定是,但要向下推送到客户机,客户机可以轻松阅读它,并根据日程/当前预订和小时数显示当天的可用性。希望在后台执行这种操作,并以这种方式保持许多项目的一致状态。而不是在数百个项目的大型查询中进行实时查询,听起来像是在为可用性日历编写API端点。在这种情况下,您应该能够跳过Python对象,让Postgres直接在单个查询中生成适合API调用的JSON。如果您向我们展示该模式,我们可以计算出一些示例查询。我怀疑该模式滥用JSONB列来避免考虑表的设计。我正在做一个API资源,正如您所提到的,它专门发布json,每个项目都附带了可用性,我无法粘贴整个内容,因为它太长了,但这足以给出一个想法吗?谢谢你看。我想我知道你要去哪里,但我不知道从哪里开始,以获得你所描述的。SQLalchemy在这里使用,这可能会限制我一点。谢谢!好吧,我有预感它会朝那个方向发展。我有你推荐使用的这种想法,非常棒。目前,这个想法会让我明白“该物品在当前时间或我给出的时间范围内是否可用”,但并不代表它在剩余时间内是否可用。我正在寻找一种方法来表示每小时的状态。就像一个有x的日历,只检查了几个小时。似乎pg将成为未来的发展方向,所以我将朝着这个方向努力,尝试用每小时的字段和查询来构建它,并按照我认为你的建议来做。
class User(SurrogatePK, Model):
__tablename__ = 'users'
# Relationships.
reservations = db.relationship('Reservation', backref='guest', uselist=False)
addresses = db.relationship('Properties', backref='host', uselist=False)
# other user props below
class Property(SurrogatePK, Model):
__tablename__ = 'addresses'
# relationships Property.host > User
host_id = db.Column(db.Integer, db.ForeignKey('users.id',
onupdate='CASCADE',
ondelete='CASCADE'),
index=True, nullable=False)
reservations = db.relationship('Reservation',
backref='address_property', uselist=False)
#schedule
schedule = Column(JSON, nullable=True)
avail_type = Column(db.Unicode(50), nullable=True) # hourly etc
is_avail = Column(db.Boolean(), default=True)
class Reservation(SurrogatePK, Model):
__tablename__ = 'reservations'
# relationships
# Reservation.guest > User
guest_id = db.Column(db.ForeignKey('users.id',
onupdate='CASCADE', ondelete='CASCADE'),
nullable=False)
address_id = db.Column(db.ForeignKey('addresses.id', onupdate='CASCADE',
ondelete='CASCADE'), nullable=False)
status = db.Column(db.Enum('pending', 'confirmed', 'rejected',
name='reservation_status_enum'), default='confirmed')
reserve_start = db.Column(db.DateTime)
reserve_end = db.Column(db.DateTime)
@classmethod
def _time_in_range(self, x):
if self.reserve_start <= self.reserve_end:
return self.reserve_start <= x <= self.reserve_end
else:
return self.start <= x or x <= self.reserve_end