Django - заполнить поле DateTime из другого набора DateTimeField с помощью auto_now

Я пытаюсь заполнить 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.

Глядя на источник для параметра auto_now DateTimeField, я вижу, что он заполняется в хуке pre_save, поэтому я ожидаю, что значение будет заполнено до сохранения.

Спасибо.


person haki    schedule 18.08.2014    source источник


Ответы (1)


Из документации джанго:

DateField.auto_now_add

Автоматически установить для поля значение «сейчас» при первом создании объекта. Полезно для создания временных меток. Обратите внимание, что всегда используется текущая дата; это не просто значение по умолчанию, которое вы можете переопределить.

Если вы хотите иметь значение времени по умолчанию для вашей «last_version_date», используйте ключ «по умолчанию» с функцией timezone.now в качестве входных данных.

from django.utils import timezone
class Poll(models.Model):
    ....
    last_version_date = models.DateTimeField(default=timezone.now,blank=False) 

См. также этот ответ. Ваша функция сохранения может стать

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 для поля вашей версии.

person Salvatore Avanzo    schedule 18.08.2014
comment
Вы упускаете суть. Я не хочу, чтобы last_version_date всегда равнялось modified - только если keep_history=True я хочу получить значение modified и сохранить его в last_version_date. Мне нужно, чтобы они были точно такими же. - person haki; 18.08.2014
comment
Вы можете оставить свой код сохранения как есть... мой совет - просто замените auto_now_add на значение по умолчанию. Вы можете смоделировать auto_new_add со значением по умолчанию, равным timezone.now. Это все. - person Salvatore Avanzo; 18.08.2014