SQLAlchemy 隐式类型转换和日期验证

SQLAlchemy implicit type conversion and Date validation

让我们假设这个模型 class:

class Person(db.Model):
    __tablename__ = "person"

    date_of_birth = db.Column(db.Date)

由于 personPerson 的实例,我可以在单元测试中执行以下操作:

person.date_of_birth = "05/05/2000"

到目前为止一切顺利,此代码已经投入生产一段时间了。现在有人报告一个错误,有人的出生日期在未来。未来的出生日期在我的上下文中是无效的,我想阻止它们进入数据存储,所以我向模型添加了一个验证器 class:

@validates("date_of_birth")
def validate_date_of_birth(self, key, date_of_birth):
    if date_of_birth and date_of_birth > datetime.now().date():
        raise BirthDayException("A date of birth must not be in the future.")
    return date_of_birth

这在某种程度上可以理解,当我从上面进行分配时,这会破坏我的单元测试并抛出异常:

>       if date_of_birth and date_of_birth > datetime.datetime.now().date():
E       TypeError: '>' not supported between instances of 'str' and 'datetime.date'

虽然我不太明白我应该在哪里解决它。

感谢您的意见。

Fwiw,我最终做了一件不可思议的事情——检查类型并转换为日期,如果它是一个字符串:

if type(date_of_birth) is str:
    date_of_birth = datetime.datetime.strptime(date_of_birth, "%m/%d/%Y").date()

    if date_of_birth and date_of_birth > datetime.datetime.now().date():
        raise BirthDayException("A date of birth must not be in the future.")