Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从表示24小时的24值整数列表派生状态_Python_Postgresql - Fatal编程技术网

Python 从表示24小时的24值整数列表派生状态

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

如果可能的话,我正试图找到一种方法来表示单个python对象中某个项的3种可用状态

我想尝试保持组合状态(24小时)与项目状态(不可用、可用和预订)的一致性

目前,我必须提取一个json字段,其中包含计划、任何可能的预订,并表示未来24小时的可用性和不可用性

第一个想法是做一个列表,其中3个状态代表24小时

带状态的24小时时钟 0不可用, 1可用(由于当前时间在计划内) 2已预订但不可用

# 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