class Tracked(models.Model):
    name = models.CharField(max_length=20)
    number = models.IntegerField()
    mutable = MutableField(default=None)

    tracker = FieldTracker()

    def save(self, *args, **kwargs):
        """ No-op save() to ensure that FieldTracker.patch_save() works. """
        super().save(*args, **kwargs)
class TrackerTimeStamped(TimeStampedModel):
    name = models.CharField(max_length=20)
    number = models.IntegerField()
    mutable = MutableField(default=None)

    tracker = FieldTracker()

    def save(self, *args, **kwargs):
        """ Automatically add "modified" to update_fields."""
        update_fields = kwargs.get('update_fields')
        if update_fields is not None:
            kwargs['update_fields'] = set(update_fields) | {'modified'}
        super().save(*args, **kwargs)
class ModelTracked(models.Model):
    name = models.CharField(max_length=20)
    number = models.IntegerField()
    mutable = MutableField(default=None)

    tracker = ModelTracker()
class TrackedAbstract(AbstractTracked):
    name = models.CharField(max_length=20)
    number = models.IntegerField()
    mutable = MutableField(default=None)

    tracker = FieldTracker()