django-dirtyfield

Track changed data in Django Models


Keywords
django, model, dirty, field
License
BSD-3-Clause
Install
pip install django-dirtyfield==1.0

Documentation

django-dirtyfield

django-dirtyfield tracks changes to model instances.

Usage

Inherit from djangodirtyfield.mixin.DirtyFieldMixin

class MyModel(models.Model, DirtyFieldMixin):
    pass

Call get_changes() to list modifications.

Using a custom model.save()

Add a call to self.update_dirtyfields_copy() after any modifications done in a custom model.save().

Multiple sources

It is possible to track and namespace specified fields, eg. if you're using the model to sync with LDAP.

class ModelLdapDirtyField(DirtyFieldMixin):
    sources = {'default': {'state': '_original_state', 'lookup': '_as_dict', 'fields': '_get_fields'},
            'ldap': {'state': '_ldap_original_state', 'lookup': '_ldap_as_dict', 'fields': 'get_ldap_fields'}}
    def _ldap_as_dict(self, *args, **kwargs):
        fields = {}
        for k,v in getattr(self, 'ldap_only_fields', {}).iteritems():
            fields.update({k: getattr(self, k, '')})
        return fields

    def get_ldap_fields(self):
        return {'get_ldap_cn': 'cn',
                'username': ['uid'],
                'first_name':'givenName'}

class MyModel(ModelLdapDirtyFieldMixin):
    pass

Call get_changes() to list modifications for states default and ldap.