我尝试使用last_version_date
从modified
字段集填充auto_now
。在我的保存方法中,如果创建了新版本,我想保存该记录的修改日期。
简化示例:
class Poll(models.Model):
question = models.CharField(max_length=200)
modified = models.DateTimeField(auto_now=True)
version = models.IntegerField(blank=False, default=1)
last_version_date = models.DateTimeField(auto_now_add=True,blank=False)
def save(self, keep_history=False, *args, **kwargs):
if keep_history:
self.last_version_date = self.modified
self.version = self.version + 1
return super(Poll, self).save(*args, **kwargs)
用法
>>> p = Poll.objects.create(question = 'Test1')
>>> p.save()
>>> p.modified
datetime.datetime(2014, 8, 18, 6, 50, 41, 820000, tzinfo=<UTC>)
>>> p.last_version_date
datetime.datetime(2014, 8, 18, 6, 50, 38, 381000, tzinfo=<UTC>)
>>> p.created
datetime.datetime(2014, 8, 18, 6, 50, 38, 380000, tzinfo=<UTC>)
>>>
>>>
>>> p.save(True)
>>> p.modified
datetime.datetime(2014, 8, 18, 6, 51, 1, 804000, tzinfo=<UTC>)
>>> p.last_version_date
datetime.datetime(2014, 8, 18, 6, 50, 41, 820000, tzinfo=<UTC>)
请注意,在第二次保存中,last_version_date
如何使用之前的modified
值进行更新。
查看DateTimeField
auto_now
选项的来源,我看到它正在pre_save
挂钩中填充,所以我希望这个值可以填充在保存之前。
感谢。
答案 0 :(得分:0)
来自django文档:
DateField.auto_now_add
首次创建对象时自动将字段设置为现在。用于创建时间戳。注意 始终使用当前日期; 它不仅仅是默认值 你可以覆盖。
如果你想拥有'last_version_date'的默认时间值,请使用带有timezone.now函数作为输入的'default'键
from django.utils import timezone
class Poll(models.Model):
....
last_version_date = models.DateTimeField(default=timezone.now,blank=False)
另见answer。 您的保存功能可以
def save(self, *args, **kwargs):
keep_history = kwargs.get('keep_history', False)
if keep_history:
self.last_version_date = self.modified
self.version = self.version + 1
并将其用作以下
>>> p.save(keep_history=True)
您还可以从并发中为您的版本字段使用 IntegerVersionField 。