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<[email protected]>  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