繁体   English   中英

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

[英]In Peewee I have a datetime field defaulted to datetime.datetime.now(). But when inserted, it takes the time the server was started. Why

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

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

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

timestamp = peewee.DateTimeField(default=datetime.datetime.now)

它应该这样做。 覆盖save方法

class myModel(Model):

    name = CharField()
    timestamp = DateTimeField()

    def save(self, *args, **kwargs):
        self.timestamp = datetime.datetime.now()
        super(myModel, self).save(*args, **kwargs)

修复后工作正常

它是在编译时间(服务器启动的时间)

[编辑],因为你已经使用了datetime.datetime.now() (带括号)正如@coleifer所建议你可以使用datetime.datetime.now (没有paranthesis)来启动运行时调用。

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

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)

看起来重复这是在MySQL中像TimeStamp这样的peewee中有DateTimeField的自动更新选项吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM