当一个字段可以是 None 时,如何使用 timedelta 进行过滤?
How to filter using timedelta when a field can be None?
我正在尝试根据使用的过滤器在 PlayerAt
table 到 select 记录中创建一个方法 PlayerOc
table timedelta
。这是削减 class:
class PlayerAt(Base):
id_ = sa.Column(sa.Integer, primary_key=True)
birth_date = sa.Column(sa.Date, index=True)
def return_player_oc_records(self):
session = sa.orm.object_session(self)
qry = session.query(PlayerOc)
qry = qry.outerjoin(PlayerAt)
qry = qry.filter(PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4))
recs = qry.all()
return recs
但是,当我执行该方法时出现错误:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'datetime.timedelta'
这是因为某些 PlayerAt
记录没有 birth_date
。
我试过将过滤器转换为:
qry = qry.filter(PlayerOc.birth_date >= sa.func.IF(self.birth_date != None, self.birth_date - dt.timedelta(weeks=4), None))
但是,我得到了同样的错误。
关于修复的任何想法?
您可以使用和
qry = qry.filter((self.birth_date.isnot(None)) & (PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4)))
如果想保持无生日,可以用or条件
qry = qry.filter((self.birth_date.is_(None)) | (PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4)))
找到了使用 DATEDIFF
解决此问题的方法:
qry = qry.filter(sa.func.datediff(PlayerOc.birth_date, self.birth_date) >= -28)
我正在尝试根据使用的过滤器在 PlayerAt
table 到 select 记录中创建一个方法 PlayerOc
table timedelta
。这是削减 class:
class PlayerAt(Base):
id_ = sa.Column(sa.Integer, primary_key=True)
birth_date = sa.Column(sa.Date, index=True)
def return_player_oc_records(self):
session = sa.orm.object_session(self)
qry = session.query(PlayerOc)
qry = qry.outerjoin(PlayerAt)
qry = qry.filter(PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4))
recs = qry.all()
return recs
但是,当我执行该方法时出现错误:
TypeError: unsupported operand type(s) for -: 'NoneType' and 'datetime.timedelta'
这是因为某些 PlayerAt
记录没有 birth_date
。
我试过将过滤器转换为:
qry = qry.filter(PlayerOc.birth_date >= sa.func.IF(self.birth_date != None, self.birth_date - dt.timedelta(weeks=4), None))
但是,我得到了同样的错误。
关于修复的任何想法?
您可以使用和
qry = qry.filter((self.birth_date.isnot(None)) & (PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4)))
如果想保持无生日,可以用or条件
qry = qry.filter((self.birth_date.is_(None)) | (PlayerOc.birth_date >= self.birth_date - dt.timedelta(weeks=4)))
找到了使用 DATEDIFF
解决此问题的方法:
qry = qry.filter(sa.func.datediff(PlayerOc.birth_date, self.birth_date) >= -28)