django-model-utilsのModelTrackerを試してみる
基本的にモデルが変更されたときにに変更前の値を保持する機能を提供するものらしい
まずModelTrackerのインスタンスをクラスフィールドに持つモデルを用意
class Entry(models.Model): title = models.CharField(max_length=100) body = models.TextField() tracker = ModelTracker()
ModelTracker.changed
変更されているフィールドを辞書で返す
>>> entry = Entry.objects.create(title='First Entry') >>> entry.tracker.changed() {} >>> entry.title = 'First Entry updated' >>> entry.tracker.changed() {'title': 'First Entry'}
ModelTracker.has_changed
フィールドを指定して変更前されているかどうかをboolで返す
>>> entry = Entry.objects.create(title='First Entry') >>> entry.tracker.has_changed('title') False >>> entry.title = 'First Entry updated' >>> entry.tracker.has_changed('title') True
ModelTracker.previous
フィールドを指定して変更前の値を返す
>>> entry = Entry.objects.create(title='First Entry') >>> entry.tracker.previous('title') 'First Entry' >>> entry.title = 'First Entry updated' >>> entry.tracker.previous('title') 'First Entry'
ModelTrackerのインスタンスを作成するときにfieldsを渡すとtrackするフィールドを限定できる
class Entry(models.Model): title = models.CharField(max_length=100) body = models.TextField() tracker = ModelTracker(fields=['title'])
>>> entry = Entry.objects.create(title='First Entry') >>> entry.body = 'test' >>> entry.tracker.changed() {}
いまいち使いどころが思いつかないけど、知ってればイザというときに思い出すかもしれない。
関連 : django-model-utilsをいろいろ試してみる その1 StatusModel - brainstorm
関連 : django-model-utilsをいろいろ試してみる その2 TimeFramedModel - brainstorm
関連 : django-model-utilsをいろいろ試してみる その3 InheritanceManager - brainstorm
参考 : carljm / django-model-utils / source / ― Bitbucket