当一个字段可以是 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)