1

我想使用 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?

4

1 回答 1

0

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

>>> 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,如果您只传递函数调用的结果,它会将其解释为另一个静态值。

于 2015-11-25T17:13:45.853 回答