python / expert
Snippet
Selective Model Field Mutation Tracking via Dunder Descriptor Mechanics
Python's descriptor protocol (`__get__` and `__set__`) allows fine-grained control over model field access. By intercepting set operations, descriptors can compare new values against internal state attributes to automatically populate a dirty-field tracking set on model instances.
snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TrackedFieldDescriptor:def __init__(self, field_name):self.field_name = field_nameself.internal_name = f"_{field_name}"def __get__(self, instance, owner=None):if instance is None:return selfreturn getattr(instance, self.internal_name, None)def __set__(self, instance, value):old_val = getattr(instance, self.internal_name, None)if old_val != value:dirty = getattr(instance, '_dirty_fields', set())dirty.add(self.field_name)setattr(instance, '_dirty_fields', dirty)setattr(instance, self.internal_name, value)
django
Breakdown
1
class TrackedFieldDescriptor:
Defines a custom Python non-data/data descriptor class managing attribute access.
2
def __init__(self, field_name):
Initializes descriptor storing targeted public field name and private attribute key.
3
def __get__(self, instance, owner=None):
Handles attribute retrieval for instance lookups or class-level access.
4
if instance is None: return self
Returns descriptor instance when accessed via class object rather than model instance.
5
def __set__(self, instance, value):
Intercepts assignment operations on model attributes.
6
if old_val != value:
Compares new value against existing private value to detect mutation.
7
dirty = getattr(instance, '_dirty_fields', set())
Retrieves or initializes set tracking modified field names on instance.
8
dirty.add(self.field_name)
Adds field name to dirty fields set when mutation occurs.
9
setattr(instance, '_dirty_fields', dirty)
Stores updated dirty set back onto target instance.
10
setattr(instance, self.internal_name, value)
Updates private instance field attribute with new value.