我想要一列具有DateTime类型的列,该列的默认值是从现在开始30天
我现在无法使用default=datetime.datetime.utcnow
设置默认值,但是当我尝试使用default=(datetime.datetime.utcnow + datetime.timedelta(days=30))
之类的时候
返回并错误TypeError: unsupported operand type(s) for +: 'builtin_function_or_method' and 'datetime.timedelta'
我的代码的一个更好的例子:
class Example(Base):
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
date = Column(DateTime, default=(datetime.datetime.utcnow + datetime.timedelta(days=30)))
如何在不进行硬编码的情况下做到这一点?
答案 0 :(得分:1)
创建自己的函数,该函数将返回结果:
def gen_valid_until():
valid_until = date.today() + timedelta(days=7)
return valid_until
并将函数(不是结果,所以不要加())传递给默认值
class Share(db.Model):
valid_until = db.Column(db.DateTime, nullable=False, default=gen_valid_until)
答案 1 :(得分:0)
好吧,当datetime.datetime.utcnow
是一个函数时,您可以将datetime.datetime.utcnow()
用作datetime.datetime
类
date = Column(DateTime,default =(datetime.datetime.utcnow()+ datetime.timedelta(days = 30)))
答案 2 :(得分:0)
似乎解决此问题的方法不是设置默认值,也不是将datetime.datetime.utcnow
设置为默认值,然后将其默认值分配给类__init__
方法
class Example(Base):
__tablename__ = 'example'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False, unique=True)
date = Column(DateTime)
def __init__(self, name, date=None):
self.name = name
self.date = date if date else datetime.datetime.utcnow() + datetime.timedelta(days=30)
这是唯一可行的方法
永远不要使用:
date = Column(DateTime, default=(datetime.datetime.utcnow() + datetime.timedelta(days=30)))
您不能只将被调用的参数作为默认值传递,您必须传递函数本身,否则它将第一次运行,并且它将在您创建的第一个对象上被其结果替换,这意味着每个对象您创建的日期将与第一个对象的日期相同。