def __init__(self, pk, **kwargs): self._storage = RedisHashMap(g.redis, '%s:items:%s' % (self._meta.db_name, pk)) self.pk = pk for attname, field in self._meta.fields.iteritems(): try: val = field.to_python(kwargs.pop(attname)) except KeyError: # This is done with an exception rather than the # default argument on pop because we don't want # get_default() to be evaluated, and then not used. # Refs #12057. val = field.get_default() if val: setattr(self, attname, val) if kwargs: raise ValueError('%s are not part of the schema for %s' % (', '.join(kwargs.keys()), self.__class__.__name__))
class Model(object): __metaclass__ = ModelDescriptor DoesNotExist = DoesNotExist DuplicateKeyError = DuplicateKeyError def __init__(self, pk, **kwargs): self._storage = RedisHashMap(g.redis, '%s:items:%s' % (self._meta.db_name, pk)) self.pk = pk for attname, field in self._meta.fields.iteritems(): try: val = field.to_python(kwargs.pop(attname)) except KeyError: # This is done with an exception rather than the # default argument on pop because we don't want # get_default() to be evaluated, and then not used. # Refs #12057. val = field.get_default() if val: setattr(self, attname, val) if kwargs: raise ValueError('%s are not part of the schema for %s' % (', '.join(kwargs.keys()), self.__class__.__name__)) def __getattribute__(self, key): if key in object.__getattribute__(self, '_meta').fields: return self[key] return object.__getattribute__(self, key) def __setattr__(self, key, value): if key in object.__getattribute__(self, '_meta').fields: self[key] = value return object.__setattr__(self, key, value) def __getitem__(self, key): return self._storage[key] def __setitem__(self, key, value): field = self._meta.fields.get(key) if field: value = field.to_python(value) self._storage[key] = value # Store additional predefined index if (key,) in self._meta.index or (key,) in self._meta.unique: self.objects.add_to_index(self.pk, **{key: value}) def __repr__(self): return u'<%s: %s>' % (self.__class__.__name__, unicode(self)) def __eq__(self, other): if type(self) != type(other): return False return self.pk == other.pk def __unicode__(self): return self.pk def __contains__(self, key): return key in self._storage def update(self, **kwargs): for k, v in kwargs.iteritems(): self[k] = v if len(kwargs) > 1: # Store composite indexes for fields in itertools.chain(self._meta.index, self._meta.unique): if all([f in kwargs for f in fields]): idx_kwargs = dict((f, getattr(self, f)) for f in fields) self.objects.add_to_index(self.pk, **idx_kwargs) def delete(self): # Clear all indexes first # Default index g.redis.zrem(self.objects._get_default_index_key(), self.pk) g.redis.decr(self.objects._get_default_count_key()) # Store additional predefined index for fields in itertools.chain(self._meta.index, self._meta.unique): idx_kwargs = dict((f, getattr(self, f)) for f in fields) self.objects.remove_from_index(self.pk, **idx_kwargs) # Clear out the hash table for object self._storage.clear() def post_create(self): pass