【问题标题】:Python PeeWee IntegerField - Default value of unix timestampPython PeeWee IntegerField - unix 时间戳的默认值
【发布时间】:2016-02-26 03:40:18
【问题描述】:

我想使用 PeeWee IntegerField 而不是 DateTimeField,使用自纪元以来的秒数来管理我的数据库中的时间戳。我知道字段定义可以使用可调用的默认值,但我需要执行以下操作:

timestamp = IntegerField(default=int(datetime.datetime.now().strftime('%s')))

我认为这是不正确的,因为默认值实际上不应调用可调用对象。

我还尝试将其包装在一个函数中并将该函数作为可调用函数传递:

def get_timestamp():
    return int(datetime.datetime.now().strftime('%s'))

timestamp = IntegerField(default=get_timestamp)

但是这也不起作用。

有没有办法做到这一点,还是我必须改造我的数据才能使用 DateTimeFields?

【问题讨论】:

    标签: peewee flask-peewee


    【解决方案1】:

    我看到你提到你尝试包装你的函数调用,我很惊讶这对你不起作用,因为它似乎对我来说很好:

    >>> from datetime import datetime
    >>> from peewee import *
    >>> db = SqliteDatabase(':memory:')
    >>> def get_ts():
    ...     return int(datetime.now().strftime('%s'))
    
    >>> get_ts()
    1448471382
    
    >>> class TestModel(Model):
    ...     ts = IntegerField(default=get_ts)
    ...     class Meta:
    ...         database = db
    
    >>> TestModel.create_table()
    >>> tm = TestModel.create()
    >>> tm.ts
    1448471421
    >>> ts_from_db = TestModel.get(TestModel.id == tm.id)
    >>> ts_from_db.ts
    1448471421
    

    您需要包装它的原因是因为默认参数采用 callable,如果您只传递函数调用的结果,它会将其解释为另一个静态值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多