SQLAlchemy默认DateTime,现在加上从现在开始的n天

时间:2018-09-02 02:05:33

标签: python datetime sqlalchemy

我想要一列具有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)))

如何在不进行硬编码的情况下做到这一点?

3 个答案:

答案 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)))

您不能只将被调用的参数作为默认值传递,您必须传递函数本身,否则它将第一次运行,并且它将在您创建的第一个对象上被其结果替换,这意味着每个对象您创建的日期将与第一个对象的日期相同。