Please star http://code.google.com/p/googleappengine/issues/detail?id=844 .
The fix is for the db.get code to pass in __entity during model creation time so db.Model.__init__ can set it. On Feb 16, 5:36 pm, RobertG <[email protected]> wrote: > Short version: > I want to execute code during creation of a Model subclass but I need > to know whether or not the object is saved in the datastore and/or > execute datastore queries. Since Model.is_saved() never returns True > inside __init__(), overriding this method doesn't work. I also tried > intercepting construction with a metaclass, and numerous other > approaches, but nothing I've tried works. From examining the source > code it appears that the Model objects aren't fully constructed until > after get() returns, but there doesn't seem to be a convenient, > documented location to put my intercept code. > > My specific situation is that I want to replace a ReferenceProperty > with a value I have stored in a cache to avoid a trip to the > datastore. > > Here's an example: > class A(db.Model): > str = db.StringProperty() > > class B(db.Model): > a = db.ReferenceProperty(A) > > I want the following code to succeed (assuming B is stored in > datastore): > a = from_cache(a_key) > b = B.get(key) > assert a == b.a > > I can populate B.a with the proper value using something like the > following in B: > def Load(self): > a_key = B.a.get_value_for_datastore(self) > self.a = from_cache(a_key) > > But I can't figure out where to put the call to Load(). > > Long version: > The reason I'm trying to do this is for performance. I have some very > long-lived objects that use ReferenceProperty to manage relationships > between them, plus a large number of frequently-created objects that > use ReferenceProperty to refer to the long-lived objects. After many > DeadlineExceededErrors I started using memcache to store the long- > lived objects. That helped but not enough. Profiling showed that most > of my time was now being spent in memcache, apparently because > memcache goes to the network on every get() call. So I introduced an > in-memory cache in front of memcache and now first search in-memory, > then in memcache, then go to the datastore. > > That helped a lot and I'm now avoiding the DeadlineExceededErrors but > many of my pages still take many seconds to load. Further profiling > pointed out that the ReferenceProperty attributes (primarily in my > frequently-created objects that refer to my long-lived objects) are > hitting the datastore and causing most of my performance problems. > That's the problem I'm trying to solve -- I want to be able to load > all those objects and have them use the cached long-lived objects > instead of going to the datastore to get them. > > I thought this would be a common problem but I haven't been able to > find anyone else addressing this. Either I'm not looking in the right > place, people haven't addressed this yet, those who have are not > sharing, or my data model is screwed up and doesn't work with the > AppEngine datastore very well! --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to [email protected] 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 -~----------~----~----~----~------~----~------~--~---
