15.12.09

Эмуляция key-value хранилища в django orm

Это может пригодиться в нескольких случаях. Например, при разработки проекта который может в будущем поиметь нагрузку. Чтобы на этапе разработки всем участникам не возиться с установкой кв-бд можно использовать эту заглушку. При этом структура проекта будет изначально строиться соответственно и заменой пары строк вы подключите реальное key-value хранилище.

Ещё один вариант использования - хранение настроек. Допустим заранее не известно, сколько их будет и какие. Вот, используя эту штукенцию можно избежать постоянного перекраивания модели.


class KV(models.Model):
key = models.CharField(u'Key', max_length=50, unique=True)
val = PickledObjectField(u'Value')

@classmethod
def get(cls, key, default=None):
try:
return cls.objects.get(key=key).val
except cls.DoesNotExist:
return default

@classmethod
def put(cls, key, val):
obj, new = cls.objects.get_or_create(key=key)
obj.val = val
obj.save()

@classmethod
def rm(cls, key):
try:
cls.objects.get(key=key).delete()
except cls.DoesNotExist:
pass



Работает, соответственно, так:


KV.put('updated', datetime.now())
print KV.get('updated')
KV.rm('updated')


А dict-style интерфейс я так и не написал. Пока думал как лучше сделать, текущую задачу уже решил :)

3 коммент.:

Иван Маркеев комментирует...

Спасибо, ценная заметка.

Serg комментирует...

Спасибо !

Spiritum комментирует...

спасибо, не могли бы вы привести подробный пример как это юзать? и как выглядит класс PickledObjectField?