Login

Update timestamp If any instance field has changed

Author:
craigruks
Posted:
August 5, 2011
Language:
Python
Version:
1.3
Score:
0 (after 0 ratings)

Needed a function to check if any field in an instance has changed. If so update a datetime field to now to keep track of changes. This function is an override of the save function in the model.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
def save(self, latest_update_at):
    changed = False

    # if inserting don't add the latest update at
    if self.id is None:
        super(Match, self).save()

    # otherwise check if any fields have changed
    for field in self._meta.get_all_field_names():
        if changed:
            continue

        old_value = getattr(self.__class__._default_manager.get(id=self.id), field)
        new_value = getattr(self, field)
        if new_value != old_value:
            changed = True

    if changed:
        self.latest_update_at = datetime.now()

    super(Match, self).save()

More like this

  1. Generate and render HTML Table by LLyaudet 5 days, 9 hours ago
  2. My firs Snippets by GutemaG 1 week, 1 day ago
  3. FileField having auto upload_to path by junaidmgithub 1 month, 2 weeks ago
  4. LazyPrimaryKeyRelatedField by LLyaudet 1 month, 3 weeks ago
  5. CacheInDictManager by LLyaudet 1 month, 3 weeks ago

Comments

arthur (on August 5, 2011):

I think save() of the superclass is called twice when inserting (probably not what you want).

Also, the old object is retrieved from the database for every field. You probably want something like (untested):

old_object = self.__class__._default_manager.get(id=self.id)
changed = any(getattr(self, field) != getattr(old_object
              for field in self._meta.get_all_field_names())

Lastly, in most cases the auto_now property of DateTimeField should suffice.

#

Please login first before commenting.