django – автоматически обновлять дату после изменения стоимости

В следующей модели django:

class MyModel(models.Model): published = models.BooleanField(default=False) pub_date = models.DateTimeField('date published') 

Я хочу, чтобы поле pub_date автоматически обновлялось с текущей датой, каждый раз, когда опубликованное поле изменяется на True.

Каков умный способ?

Благодарю.

только следующие изменения: pub_date, если опубликовано, изменен с False на True:

 from datetime import datetime def __init__(self, *args, **kwargs): super(MyModel, self).__init__(*args, **kwargs) self.old_published = self.published def save(self, *args, **kwargs): if self.old_published != self.published and self.published: self.pub_date = datetime.now() super(Model, self).save(*args, **kwargs) 

Если вы устанавливаете объект как опубликованный в администраторе Django, хорошим способом сделать это является переопределение метода save_model вашего класса класса модели.

 from datetime import datetime from django.contrib import admin class MyModelAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): if obj.published and 'published' in form.changed_data obj.pub_date = datetime.now() obj.save() admin.site.register(MyModel, MyModelAdmin) 

Если вы устанавливаете опубликованный флаг в другом месте, вы можете переопределить метод save() или использовать сигнал pre_save . Это не так элегантно, потому что сложнее сказать, изменился ли published флаг. Я думаю, вам нужно повторно выбрать объект из базы данных для проверки.

Все ответы были полезны, но я, наконец, сделал это так:

 def save(self, *args, **kwargs): if self.published and self.pub_date is None: self.pub_date = timezone.now() elif not self.published and self.pub_date is not None: self.pub_date = None super(Model, self).save(*args, **kwargs) 

Создайте метод publish() :

 def publish(self): self.published = True self.pub_date = datetime.datetime.now() self.save() 

Вы хотите добавить поле auto_now и установить его в True. Это будет обновляться с текущей меткой времени при каждом обновлении модели.

 pub_date = models.DateTimeField('date_published', auto_now=True) 

Вы можете прочитать об этом здесь


редактировать

Извините, вы действительно хотите изменить временную метку, когда значение опубликованного параметра равно True. Очень простой способ сделать это – получить исходное значение модели, а затем переопределить метод сохранения, чтобы он обновлялся, когда для него установлено значение True. Вот что вы добавляете к своему коду:

 class MyModel(models.Model): published = models.BooleanField(default=False) pub_date = models.DateTimeField('date published') def __init__(self, *args, **kwargs): super(MyModel, self).__init__(*args, **kwargs) self._published = self.published def save(self, *args, **kwargs): if not self._published and self.published: self.pub_date = django.timezone.now() super(MyModel, self).save(*args, **kwargs)