代码之家  ›  专栏  ›  技术社区  ›  DarkSuniuM Mirko Jelic

SQLAlchemy默认日期时间,现在加n天

  •  0
  • DarkSuniuM Mirko Jelic  · 技术社区  · 7 年前

    我想要一个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)))
    

    没有硬编码我怎么做?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Dmitry Kompot    6 年前

    创建自己的函数以返回结果:

    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)
    
        2
  •  0
  •   Kasra    7 年前

    好的,什么时候 datetime.datetime.utcnow 是你可以使用的函数 datetime.datetime.utcnow() 作为 datetime.datetime



    日期=列(日期时间,默认值=(datetime.datetime.utcnow() + 日期时间.timedelta(天=30)

        3
  •  0
  •   DarkSuniuM Mirko Jelic    7 年前

    似乎解决这个问题的方法不是设置默认值,或者 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)))
    

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