Python 带有不同创建/修改字段的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 问题(我想对我们大多数人来说这不是真正的

以下是用于了解何时创建或修改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
问题(我想对我们大多数人来说这不是真正的问题)是
创建的
修改的
字段在第一次创建时并不相等(它们之间有一个很小的增量)

您将如何改进此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)