简体   繁体   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

When I insert a row, the field is filled with the time when the server was started not the time when the row was inserted. 当我插入一行时,该字段将填充服务器启动的时间而不是插入行的时间。 Why is this happening and what is the solution? 为什么会发生这种情况,解决方案是什么? BTW I am using SQLite. 顺便说一下,我正在使用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.

When your field is loaded by the Python interpreter, it calls datetime.datetime.now() once and only once. 当您的字段由Python解释器加载时,它只调用datetime.datetime.now()一次。 So you will always get the same value. 所以你总会获得相同的价值。

Peewee supports using callables for default args, so rather than calling now() just pass in the function: Peewee支持使用callables作为默认args,所以不要只调用 now()来传递函数:

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

It should be done like this. 它应该这样做。 Override the save method 覆盖save方法

class myModel(Model):

    name = CharField()
    timestamp = DateTimeField()

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

Works fine after this fix 修复后工作正常

It is taking the compiled time (the time when the server was started) 它是在编译时间(服务器启动的时间)

[edited] because you have used datetime.datetime.now() (with parenthesis) As suggested by @coleifer you can use datetime.datetime.now (without paranthesis) to initiate a run-time call. [编辑],因为你已经使用了datetime.datetime.now() (带括号)正如@coleifer所建议你可以使用datetime.datetime.now (没有paranthesis)来启动运行时调用。

[old answer] Overriding the save method will also work [旧答案]覆盖保存方法也可以

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)

Seems Duplicate of this is there an auto update option for DateTimeField in peewee like TimeStamp in MySQL? 看起来重复这是在MySQL中像TimeStamp这样的peewee中有DateTimeField的自动更新选项吗?

暂无
暂无

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

相关问题 我想在 peewee.DateTimeField() 中存储日期时间,我在该字段中默认使用 datetime.datetime.now() 但它无法工作 - I want to store datetime in peewee.DateTimeField(), I use datetime.datetime.now() in that field as default but it can't work 日期时间.日期时间.now() + 1 - datetime.datetime.now() + 1 为什么datetime.datetime.now()-datetime.datetime.now()等于datetime.timedelta(-1,86399,999974)? - Why does datetime.datetime.now() - datetime.datetime.now() equal to datetime.timedelta(-1, 86399, 999974)? 为什么在Python中将now方法获取为datetime.datetime.now而不是datetime.time.now? - Why method now in Python is obtained as datetime.datetime.now instead of datetime.time.now? Pandas datetime 失败时 mocking datetime.datetime.now() - Pandas datetime failing when mocking datetime.datetime.now() 减去两个datetime.datetime.now()。time()对象 - Subtracting two datetime.datetime.now().time() objects 在描述符中使用时,time.time()和datetime.datetime.now()不会获取当前时间 - time.time() and datetime.datetime.now() does not get current time when used in a descriptor asyncio.loop.time() 与 datetime.datetime.now() 和如何比较? - Is asyncio.loop.time() comparable with datetime.datetime.now() and how? 如何将datetime.datetime.now()转换为Number - How to Convert datetime.datetime.now() to Number datetime.datetime.now()返回旧值 - datetime.datetime.now() returns old value
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM