Python 带有不同创建/修改字段的Django时间戳mixin
以下是用于了解何时创建或修改Django对象的经典mixin:Python 带有不同创建/修改字段的Django时间戳mixin,python,django,Python,Django,以下是用于了解何时创建或修改Django对象的经典mixin: class TimeStampable(models.Model): created = models.DateTimeField(auto_now_add=True, editable=False) modified = models.DateTimeField(auto_now=True) class Meta: abstract = True 问题(我想对我们大多数人来说这不是真正的
class TimeStampable(models.Model):
created = models.DateTimeField(auto_now_add=True, editable=False)
modified = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
问题(我想对我们大多数人来说这不是真正的问题)是创建的
和修改的
字段在第一次创建时并不相等(它们之间有一个很小的增量)
您将如何改进此mixin以解决该特定问题
我检查了django model utils的源代码,但什么也没找到。我想我们需要重写
\uuuu init\uuu
方法?如果希望两个时区对象相等,则必须在时间上创建完全相同的实例。这实际上是不可能的,尤其是当您连续调用timezone.now()
时
基本上,在对象创建时timestable
发生的情况是:
获取一个created
时区。现在
实例
获取一个modified
在时区。现在
时区之后创建了一个很小的时间分数创建的
我们可以覆盖模型的
.save()
方法来解决此问题:
我们将使用模型的方法(它是的实例)来定义对象是否尚未保存(新创建)- 如果它是新创建的,我们需要一个(并且只有一个)实例 现在并将其传递给创建的和修改的字段
- 如果对象刚刚被修改,我们不能忘记传递
到时区的实例。现在
字段modified
class MyTimestampableModel(Timestampable): ... def save(self, *args, **kwargs): timezone_now = timezone.now() if self._state.adding: self.created = timezone_now self.modified = timezone_now super(MyTimestampableModel, self).save(*args, **kwargs)