在Peewee中,我有一个datetime字段默认为datetime.datetime.now().但是在插入时,需要花费服务器启动的时间.为什么

Sam*_*nty 4 python sqlite orm web.py peewee

当我插入一行时,该字段将填充服务器启动的时间而不是插入行的时间.为什么会发生这种情况,解决方案是什么?顺便说一下,我正在使用SQLite.

class LOG(peewee.Model):
    id = peewee.IntegerField(unique=True,primary_key=True)
    timestamp = peewee.DateTimeField(default=datetime.datetime.now())
    log = peewee.CharField()
    by = peewee.IntegerField(default=1)
    class Meta:
        database = database


  LOG.create(log = _log , by = _by)  
  # above statement is called at say 3:00 pm and I started the server at 2:00 pm, then the row is inserted with timestamp of 2pm not 3pm.
Run Code Online (Sandbox Code Playgroud)

col*_*fer 21

当您的字段由Python解释器加载时,它只调用datetime.datetime.now()一次.所以你总会获得相同的价值.

Peewee支持使用callables作为默认args,所以不要只调用 now()来传递函数:

timestamp = peewee.DateTimeField(default=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)


Ant*_*nto -7

它正在花费编译时间(服务器启动的时间)

[编辑]因为您已经使用datetime.datetime.now()(带括号)按照@coleifer的建议,您可以使用datetime.datetime.now(不带括号)来启动运行时调用。

[旧答案] 覆盖 save 方法也可以

class LOG(peewee.Model):
    id = peewee.IntegerField(unique=True,primary_key=True)
    timestamp = peewee.DateTimeField()
    log = peewee.CharField()
    by = peewee.IntegerField(default=1)
    class Meta:
        database = database

    def save(self, *args, **kwargs):
        self.modified = datetime.datetime.now()
        return super(Something, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

似乎与此重复, peewee 中的 DateTimeField 是否有像 MySQL 中的 TimeStamp 一样的自动更新选项?

  • 这不太正确。Peewee 支持可调用,因此您可以说“default=datetime.datetime.now”(无括号)。 (3认同)