Django - 使用auto_now设置的其他DateTimeField填充DateTime字段

时间:2014-08-18 07:00:49

标签: django

我尝试使用last_version_datemodified字段集填充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挂钩中填充,所以我希望这个值可以填充在保存之前。

感谢。

1 个答案:

答案 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