Overriding TimeStampedModel's save() method (#412)

* Overriding TimeStampedModel's save() method

to update modified field automatically when update_fields argument is used but modified was not given as a parameter.

* fixed a small error in logic

* added tests for new functionality
This commit is contained in:
H. Buğra Aydın 2020-01-23 10:19:06 +03:00 committed by Asif Saif Uddin
parent 1386c379b7
commit 3e32ae257b
2 changed files with 38 additions and 0 deletions

View file

@ -28,6 +28,16 @@ class TimeStampedModel(models.Model):
created = AutoCreatedField(_('created'))
modified = AutoLastModifiedField(_('modified'))
def save(self, *args, **kwargs):
"""
Overriding the save method in order to make sure that
modified field is updated even if it is not given as
a parameter to the update field argument.
"""
if 'update_fields' in kwargs and 'modified' not in kwargs['update_fields']:
kwargs['update_fields'] += ['modified']
super().save(*args, **kwargs)
class Meta:
abstract = True

View file

@ -90,3 +90,31 @@ class TimeStampedModelTests(TestCase):
self.assertEqual(t1.created, different_date2)
self.assertNotEqual(t1.modified, different_date2)
self.assertNotEqual(t1.modified, different_date)
def test_save_with_update_fields_overrides_modified_provided(self):
'''
Tests if the save method updated modified field
accordingly when update_fields is used as an argument
and modified is provided
'''
with freeze_time(datetime(2020,1,1)):
t1 = TimeStamp.objects.create()
with freeze_time(datetime(2020,1,2)):
t1.save(update_fields=['modified'])
self.assertEqual(t1.modified, datetime(2020,1,2))
def test_save_with_update_fields_overrides_modified_not_provided(self):
'''
Tests if the save method updated modified field
accordingly when update_fields is used as an argument
and modified is not provided
'''
with freeze_time(datetime(2020,1,1)):
t1 = TimeStamp.objects.create()
with freeze_time(datetime(2020,1,2)):
t1.save(update_fields=[])
self.assertEqual(t1.modified, datetime(2020,1,2))