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()