我希望您可以在记录每次修改时更新时间戳字段,就像在MySQL中一样。使用
DateTimeField(default=datetime.datetime.now())
只会在第一次创建时设置它...有没有简单的解决方案?难道唯一的解决方案是在MySQL数据库中手动设置列选项吗?您可以在您的模型类上覆盖save
方法。
class Something(Model):
created = DateTimeField(default=datetime.datetime.now)
modified = DateTimeField
def save(self, *args, **kwargs):
self.modified = datetime.datetime.now()
return super(Something, self).save(*args, **kwargs)
只需在MySQL中使用TIMESTAMP类型。每当行更新时,该字段将自动更新。
在model
中:
last_updated = peewee.TimestampField()
ON UPDATE
约束)。 - booshongfrom datetime import datetime
from peewee import (AutoField, CharField, DateTimeField, FloatField,
IntegerField, Model, MySQLDatabase, TextField, SQL)
from config import DataBaseConfig
mysql_client = MySQLDatabase(
"your_database_name",
host=DataBaseConfig.host,
port=DataBaseConfig.port,
user=DataBaseConfig.user,
password=DataBaseConfig.password,
)
class CommonModel(Model):
id = AutoField(verbose_name="primary key")
create_time = DateTimeField(default=datetime.now, verbose_name="create time")
update_time = DateTimeField(default=datetime.now, verbose_name="update time", constraints=[SQL('ON UPDATE CURRENT_TIMESTAMP')])
class Meta:
database = mysql_client
您也可以重写update
方法来提供功能。就像Coleifer所做的那样:
class Something(Model):
created = DateTimeField(default=datetime.datetime.now)
modified = DateTimeField
@classmethod
def update(cls, *args, **kwargs):
kwargs['modified'] = datetime.datetime.now()
return super(Something, cls).save(*args, **kwargs)
def save(self, *args, **kwargs):
self.modified = datetime.datetime.now()
return super(Something, self).save(*args, **kwargs)
您也可以在replace
方法上执行相同的操作。
update()
和delete()
)。 - booshong
.update()
,那么您可能需要在SQL端实现时间戳更新逻辑。update()
不会调用save()
。 - coleifer