Hey Christian, After adding your suggested changes (with a minor tweak) I'm happy to say that it worked perfectly.
So it needed in dal.py around 2810: elif filter.name=='__key__' and filter.op=='=': if filter.value==0: items = [] elif isinstance(filter.value, Key): item = tableobj.get(filter.value) items = (item and [item]) or [] <--- minor change. else: item = tableobj.get_by_id(filter.value) items = (item and [item]) or [] And around 2708: (As you suggested). def EQ(self,first,second=None): if isinstance(second, Key): return [GAEF(first.name,'=',second,lambda a,b:a==b) return [GAEF(first.name,'=',self.represent(second,first.type),lambda a,b:a==b) NB: This is in Version 1.92.1 (2011-03-01 12:51:40) I'd be keen to see this added. Thanks for all of your time on this. Cheers, Matt PS: The only other thing required now is exposing the GAE parent so that we can set it when models are first persisted. On Mar 2, 2:27 pm, Matt <mjwat...@gmail.com> wrote: > Thanks Christian for that code. > > I'll test it and get back to you. > > Cheers, > Matt > > On Feb 3, 12:32 pm, howesc <how...@umich.edu> wrote: > > > > > > > > > Matt, > > > sorry for the delay. Since i don't have use for the key queries yet i'm > > gonna ask you to try something, and then we can ask massimo to include > > it.... > > > * grab the latest web2py source from trunk, i have mercurial commit #1572 > > * in gluon/dal,py find line 2697. it should look like: > > 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 [] > > * edit the if block method. this if for GAE only to: > > elif filter.name=='__key__' and filter.op=='=': > > if filter.value==0: > > items = [] > > elif isinstance(filter.value, Key): > > items = tableobj.get(filter.value) > > else: > > item = tableobj.get_by_id(filter.value) > > items = (item and [item]) or [] > > * test this. if it works you are done. > > * if it did not work, find line 2600: > > def EQ(self,first,second=None): > > return [GAEF(first.name,'=',self.represent(second,first.type),lambda > > a,b:a==b) > > * edit the EQ method: > > def EQ(self,first,second=None): > > if isinstance(second, Key): > > return [GAEF(first.name,'=',second,lambda a,b:a==b) > > return [GAEF(first.name,'=',self.represent(second,first.type),lambda > > a,b:a==b) > > > what does this do? you ask....well, the first edit finds the spot where the > > GQL Query object is created. if you are doing a key query (based on ID), > > and the operator is '=' you are adding in a check that if the value you are > > filtering is a Key (instead of a long) then do a key query on the Model. in > > the edit of the EQ method, you are allowing the pass of a raw key to the > > filter creation, so that when the query is run the code that you wrote in > > select_raw() runs. > > > once you make the edits you should be able to construct a GQL Key object and > > then do db(db.table.id==myGQLKeyObject).select(). > > > give it a try and let me know if it works. like i said, since i don't have > > a model like yours i don't have a way to test it, please be patient with my > > typos and other things. > > > christian