以下是用于了解何时创建或修改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
问题(对我们大多数人来说,这不是一个真正的问题)是created
和modified
字段在第一次创建时不相等(两者之间存在微小的差异)它们)。
你如何改善这个混合来解决这个具体问题?
我检查了django-model-utils
源代码但没有找到任何内容
我想我们需要覆盖__init__
方法?
答案 0 :(得分:1)
如果您希望2个时区对象相等,则必须及时创建完全相同的实例。这几乎是不可能的,尤其是当你串联调用timezone.now()
时。
基本上在TimeStampable
对象创建时发生的事情是:
created
获得timezone.now
个实例。modified
获得timezone.now
,在created
之后创建了一小部分时间。我们可以覆盖模型的.save()
方法来解决这个问题:
我们将使用模型的_state.adding()
方法(ModelState
的实例)来定义对象是否尚未保存(新创建)。
timezone.now
的{{1}}并将其传递给created
和modified
字段。如果对象刚被修改,我们一定不要忘记将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)