I don't know if this will help but I've built a custom property for
dealing with basic dict items. It's based on StringListProperty, so
you still have some indexing for searching on keys, or "key:value"
pairs.

The code has not been tested much yet...

class DictListProperty(db.StringListProperty):
        def __init__(self, *args, **kwds):
                #cache reads so we only process list once
                self._cache = None
                super(DictListProperty, self).__init__(*args, **kwds)

        def get_value_for_datastore(self, model_instance):
                value = super(DictListProperty,
self).get_value_for_datastore(model_instance)
                if value is None:
                        return None
                else:
                        #convert dict to list of key:value
                        l=[]
                        for k, v in value.items():
                                #expand any lists out (for tag lists etc)
                                if isinstance(v,list):
                                        l.append(k)#add empty key with no value 
so we know this is a list
                                        for i in v:
                                                l.append(k+":"+str(i))
                                else:
                                        l.append(k+":"+str(v))
                        return self.data_type(l)

        def validate(self, value):
                return value

        def make_value_from_datastore(self, value):
                if self._cache is None:
                        if value is None:
                                return None
                        elif isinstance(value, list):
                                self._cache = {}
                                #split list of key:values back into dict
                                for v in value:
                                        s=v.split(":",1)
                                        if len(s)==1 and 
self._cache.has_key(s[0]): #special case for
single item list
                                                self._cache[s[0]] = 
list(self._cache[s[0]])
                                        elif len(s)==1: #special case for empty 
list
                                                self._cache[s[0]] = []
                                        elif self._cache.has_key(s[0]): #add to 
list
                                                 self._cache[s[0]] = 
list(self._cache[s[0]])
                                                 self._cache[s[0]].append(s[1])
                                        else:
                                                self._cache[s[0]]=s[1]
                                return self._cache
                        else:
                                return None
                else:
                        return self._cache


#Tests..

class TestModel(db.Model):
        d = DictListProperty()


#Main Test
t = TestModel()
t.d = {"a":1,"b":"2test","c":"3:test'here'withsemicolon
+junk&in,string"} #basic key:value structure, non-strings saved as
string
t.d["list"]=[0,1,2,3] #lists are also supported, expanded and stored
as d,d:0,d:1,d:2 etc. so can be indexed.
t.d["empty"]=[] #empty list will return as empty list, stored as just
"key"
t.put()

t = TestModel.get(p.key())
#t = Test.all().filter("d = ","b:2test").get() #for equality you need
to combine full "key:value" as string
#t = Test.all().filter("d = ","list:2").get() #lists are expanded for
indexing
#t = Test.all().filter("d >= ","c:").get() #inequalities can be user
to to test for just keys.
self.response.out.write(t.d) #returns a dict
self.response.out.write(t.d["list"]) #lists are re-combined

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to