Skip to content

Instantly share code, notes, and snippets.

@Ryanb58
Created September 25, 2018 19:41
Show Gist options
  • Save Ryanb58/c9466d3f84ec5b927c8def7d980ed319 to your computer and use it in GitHub Desktop.
Save Ryanb58/c9466d3f84ec5b927c8def7d980ed319 to your computer and use it in GitHub Desktop.
Django Model Change Tracker
from django.forms.models import model_to_dict
class ModelChangesMixin(object):
"""
Mixin to tracks changes to your models.
"""
def __init__(self, *args, **kwargs):
super(ModelChangesMixin, self).__init__(*args, **kwargs)
self.__original = self._data
@property
def _data(self):
return model_to_dict(self, fields=[field.name for field in
self._meta.fields])
@property
def diff(self):
original = self.__original
latest = self._data
differences = []
for field_name, value in original.items():
if value != latest[field_name]:
differences.append((field_name, (value, latest[field_name],),))
return dict(differences)
@property
def fields_changed(self):
return self.diff.keys()
@property
def has_changed(self):
return bool(self.diff)
def save(self, *args, **kwargs):
super(ModelChangesMixin, self).save(*args, **kwargs)
self.__original = self._data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment