Django TimeStamped mixin具有不同的创建/修改字段

时间:2017-11-24 13:21:07

标签: 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

问题(对我们大多数人来说,这不是一个真正的问题)是createdmodified字段在第一次创建时不相等(两者之间存在微小的差异)它们)。

你如何改善这个混合来解决这个具体问题?

我检查了django-model-utils源代码但没有找到任何内容 我想我们需要覆盖__init__方法?

1 个答案:

答案 0 :(得分:1)

如果您希望2个时区对象相等,则必须及时创建完全相同的实例。这几乎是不可能的,尤其是当你串联调用timezone.now()时。

基本上在TimeStampable对象创建时发生的事情是:

  • created获得timezone.now个实例。
  • modified获得timezone.now,在created之后创建了一小部分时间。

我们可以覆盖模型的.save()方法来解决这个问题:

我们将使用模型的_state.adding()方法(ModelState的实例)来定义对象是否尚未保存(新创建)。

  • 如果是新创建的,我们需要一个(也是唯一一个)实例 timezone.now的{​​{1}}并将其传递给createdmodified字段。
  • 如果对象刚被修改,我们一定不要忘记将timezone.now的实例传递给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)