Created
September 25, 2018 19:41
-
-
Save Ryanb58/c9466d3f84ec5b927c8def7d980ed319 to your computer and use it in GitHub Desktop.
Django Model Change Tracker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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