For posterity, one such gotcha is a case where Model instances work fine, but Expando instances can loose their additive attributes coming back out of the datastore. Switched to factory @staticmethod, and all is good now...
On Tue, Aug 25, 2009 at 6:32 AM, Nick Johnson (Google)<nick.john...@google.com> wrote: > On Mon, Aug 24, 2009 at 6:44 PM, Jeff Enderwick <jeff.enderw...@gmail.com> > wrote: >> >> thanks - I got bit by those __init__ nuances over the weekend. I ended >> up passing an optional flag to the __init__ to say "this is really a >> new() vs a datastore reconstitution". I del the optional flag from >> kwargs before calling the super __init__. In the datastore >> reconstitution case, I do nothing but call the super __init__. >> >> Does that cover the __init__ gotchas, or am I digging my own grave by >> not converting to a distinct create function? > > I don't know the gotchas well enough to say. I still think a factory > function is your best bet. :) > -Nick Johnson > >> >> On Mon, Aug 24, 2009 at 3:56 AM, Nick Johnson >> (Google)<nick.john...@google.com> wrote: >> > Hi Jeff, >> > >> > On Sat, Aug 22, 2009 at 7:24 PM, Jeff Enderwick >> > <jeff.enderw...@gmail.com> >> > wrote: >> >> >> >> Currently, one must put() in order to have obj.key() be valid. In some >> >> flows, I find my self having to put() object twice for this reason. >> >> >> >> If I make a synthetic key, it appears that I can avoid this: >> >> >> >> class Joker(db.Model): >> >> unused = db.StringProperty() >> >> def __init__(self): >> >> m = hashlib.sha1() >> >> m.update(str(time.time())) >> >> name = base64.b64encode(m.digest()) >> >> logging.debug("name="+name) >> >> db.Model.__init__(self, key_name=name) >> >> >> >> 1) GOOG folks - are there any performance downsides to taking this >> >> approach? >> > >> > Not really, no. >> > >> >> >> >> 2) If no, are there any other environmental factors that might be >> >> fodder for the hash (user, etc)? >> > >> > I would recommend using uuid.uuid4().hex instead of a straight SHA1 sum. >> > UUIDs are guaranteed to be unique. >> > I would also recommend defining a class method called something like >> > 'create' that generates the key name and calls __init__. There are >> > subtle-use cases around __init__ and reconstructing entities from the >> > datastore, and it's difficult to get right - much more straightforward >> > to >> > define a class method to construct new entities. >> > -Nick Johnson >> >> >> >> >> >> Thanks, >> >> Jeff >> >> >> >> >> > >> > >> > >> > -- >> > Nick Johnson, Developer Programs Engineer, App Engine >> > >> > > >> > >> >> > > > > -- > Nick Johnson, Developer Programs Engineer, App Engine > > > > --~--~---------~--~----~------------~-------~--~----~ 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 google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~----------~----~----~----~------~----~------~--~---