Skip to content

Instantly share code, notes, and snippets.

@bruth
Created March 8, 2012 15:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bruth/2001416 to your computer and use it in GitHub Desktop.
Save bruth/2001416 to your computer and use it in GitHub Desktop.
ETag "ready" Django model using a version number
class Song(VersionedModel):
"""
>>> song = Song(title='Here Come the Sun')
>>> song.save()
>>> cache.get('music.song-1,1)
1
>>> song.title = 'Here Comes the Sun'
>>> song.save()
>>> cache.get('music.song-1,1)
>>> cache.get('music.song-1,2)
1
"""
title = models.CharField(max_length=100)
from django.db import models
from django.core.cache import cache
class VersionedModel(models.Model):
version = models.IntegerField(default=0)
class Meta(object):
abstract = True
def save(self, *args, **kwargs):
etag = self.invalidate_cache()
self.version += 1
try:
super(VersionedModel, self).save(*args, **kwargs)
except Exception, e:
# Revert if the save failed
self.version -= 1
cache.set(etag, 1)
raise e
def invalidate_cache(self):
etag = self.generate_etag()
cache.delete(etag)
return etag
def generate_etag(self):
kwargs = {
'app': self._meta.app_label,
'model': self._meta.module_name,
'id': self.id,
'version': self.version,
}
return '{app}.{model}-{id},{version}'.format(**kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment