Thanks Christian,

Your suggestion looks good.

Could potentially specify the "tablename" like:

db(db.address.id == ['user:21', 'address:96'])

NB: this would need to support full recurvsive key generation so that
you could specify:

Assuming:

                              C.parent = D.id = 4
                   B.parent = C.id = 3
        A.parent = B.id = 2
        A.id = 1

And have the key generated as:

        key = Key.from_path('A', 1, parent=Key.from_path('B', 2,
parent=Key.from_path('C', 3, parent=Key.from_path('D', 4))))

Which would equate to:

        a = db(db.A.id == ['D:4', 'C:3', 'B:2', 'A:1'])

Matt

On Jan 11, 3:48 pm, Christian Foster Howes <how...@umich.edu> wrote:
> Matt,
>
> so now i understand completely.  thanks for the clarification.
>
> this may be crazy talk, so hopefully those closer to the DAL will weigh
> in here, but take a look at line select_raw of dal.py (i don't have a
> line number since i have all modified versions, it's around 2670):
>
>              elif filter.name=='__key__' and filter.op=='=':
>                  if filter.value==0:
>                      items = []
>                  else:
>                      item = tableobj.get_by_id(filter.value)
>                      items = (item and [item]) or []
>
> here is where the db(db.address.id == 42) gets put together.  I'm making
> the assumption you would only do == queries, and that you might like
> something this for your query:
>     db(db.address.id == [<parent_obj>, <this_id>]
>
> which gets put into the dal code block like:
>
>              elif filter.name=='__key__' and filter.op=='=':
>                  if filter.value==0:
>                      items = []
>                  if isinstance(filter.value, list):
>                      key = Key.from_path(filter.value[0].tablename, #get
> table name here somehow
>                                          filter.value[0].id,
>                                          tablename, filter.value[1],
>                  else:
>                      item = tableobj.get_by_id(filter.value)
>                      items = (item and [item]) or []
>
> NOTE: i have not tested or even run this code.  just a suggestion on
> what it might look like.
>
> there is also this 
> thread:https://groups.google.com/forum/#!topic/web2py/WNDXVNNUyQ8 but it does
> not model parents quite like GAE would by default.
>
> cfh
>
> On 01/10/2011 06:21 PM, Matt wrote:
>
>
>
>
>
>
>
> > Hi Christian,
>
> > Thanks for your response.
>
> > In order to save my entities (as part of an entity group) I've had to
> > set the parent of the 'address' to be the 'user'. That way I can use a
> > transaction to persist these multiple entities in one go.
>
> > I.e. assuming:
>
> >    db.define_table('user',
> >            db.Field('name', 'string'))
>
> >    db.define_table('address',
> >            db.Field('street', 'string'))
>
> > In my code (more or less):
>
> >    from google.appengine.ext import db as gae
>
> >    def txn(name, street):
> >            user = db.user._tableobj(name=name)
> >            address = db.address._tableobj(parent=user, street=street)
> >            user.put()
> >            address.put()
>
> >    gae.run_in_transaction(txn, name='Barry', street='Whatever')
>
> > Now since I've used a parent for the address I can't do queries using
> > the DAL like:
>
> >    address = db.address(addressId)
>
> > or
>
> >    address = db.address(db.address.id == addressId) etc.
>
> > As it always returns None as the "key" for this entity is now composed
> > of itself plus it's parent. Which I have no way to specify.
>
> > So hence I have to step outside of web2py to retrieve records using
> > raw GQL calls and means that I lose nice web2py features like:
>
> > Inside my html:
>
> >    {{= address.user.name }}
>
> > Does that make sense?
>
> > Ideally I'd like to be able to construct the key and compare it like
> > any other field.
>
> > Perhaps a custom GAE method to support this could be added to the
> > core?
>
> > Cheers,
> > Matt
>
> > On Jan 11, 12:55 pm, howesc<how...@umich.edu>  wrote:
> >> I must admit i'm not following your example.  why do you need to query by
> >> GAE __key__ rather than by ID?  (i have not used ancestors in GAE so maybe
> >> that is why i'm mis-understanding).
>
> >> but your reference to my previous exchange made me look at this in the new
> >> DAL - and the !=,<,>,<=, and>= queries are broken again on GAE.  I'll
> >> work on putting a patch together for that since i did it before.  if you
> >> help me understand your problem better perhaps i can help get you the
> >> solution that you need.
>
> >> thanks,
>
> >> christian

Reply via email to