On Thursday, August 15, 2013 6:57:23 AM UTC-4, Quint wrote:

> like this?
>  
> You run a query with an extra option specify the ref fields to pre-fetch. 
> and then it would query all the referenced rows in a smart way (only fetch 
> a record 1x).
>  
> Is there a  generally accepted way to handle this (in the absence of  the 
> mentioned feature)?
>

Well, the most efficient way is probably to do a join, but that results in 
a somewhat different type of object.
 

>  
> Right now I'm fetching my rows and loop over it and store the referenced 
> rows in a dictionary and at the end use the dict to store the fetched rows 
> on the parent rows.
> Then a pass the composite thing to my view.
>

I suppose you could also do something like that using Field.Virtual:

db.define_table('person',
    Field('name'),
    Field.Virtual('dogs', lambda r: r.person.dog.select()))

db.define_table('dog',
    Field('name'),
    Field('owner', 'reference person'))

bob = db(db.person.name == 'Bob').select().first()
print bob.dogs

Or going in the other direction:

db.define_table('person',
    Field('name'))

db.define_table('dog',
    Field('name'),
    Field('owner', 'reference person'),
    Field.Virtual('owner_record', lambda r: db.person(r.dog.owner)))

spot = db(db.dog.name == 'spot').select().first()
print spot.owner_record.name

Note, don't define these virtual fields in both tables at the same time, as 
that will lead to infinite recursion when attempting a select from either 
one.

Anthony

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to