django-model-utilsをいろいろ試してみる その4 ModelTracker

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