首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同创建/修改字段的Django TimeStamped混合器

具有不同创建/修改字段的Django TimeStamped混合器
EN

Stack Overflow用户
提问于 2017-11-24 13:21:06
回答 1查看 1.4K关注 0票数 1

下面是用于了解何时创建或修改Django对象的经典混合器:

代码语言:javascript
复制
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__方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-29 15:17:07

如果希望两个时区对象相等,则必须及时创建完全相同的实例。这几乎是不可能的,特别是当您连续调用timezone.now()时。

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

  • created获得一个timezone.now实例。
  • modified得到一个timezone.now,它是在created的时间分数之后创建的。

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

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

  • 如果是新创建的,我们需要接受timezone.now的一个(而且只有一个)实例,并将其传递给createdmodified字段。
  • 如果对象刚刚被修改,我们不能忘记将timezone.now的一个实例传递给modified字段。 MyTimestampableModel类(时间戳):.def保存(self,*args,**kwargs):timezone_now = timezone.now()如果self._state.adding: self.created = timezone_now self.modified = timezone_now超级(MyTimestampableModel,self).save(*args,**kwargs)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47474228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档