Это может пригодиться в нескольких случаях. Например, при разработки проекта который может в будущем поиметь нагрузку. Чтобы на этапе разработки всем участникам не возиться с установкой кв-бд можно использовать эту заглушку. При этом структура проекта будет изначально строиться соответственно и заменой пары строк вы подключите реальное 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 коммент.:
Спасибо, ценная заметка.
Спасибо !
спасибо, не могли бы вы привести подробный пример как это юзать? и как выглядит класс PickledObjectField?
Отправить комментарий