Didn't realize you could make a second query in a Virtual field but makes 
sense now that I see it.  Although I'd rather not make the extra query (2 
actually since longitude would need to do the same thing) so I guess I will 
just add latitude and longitude directly to my original select instead of 
trying to make them Virtual fields. e.g.

db(db.location.id>0).select(db.location.ALL, db.location.point.st_x(), db.
location.point.st_y())



On Friday, January 3, 2014 4:16:57 AM UTC-5, Paolo Valleri wrote:

> st_*() are db engine functions, you should query the db to get the output 
> you are looking for. Given that, in your virtual field you should make a 
> new query, something like that:
>
> Field.Virtual('latitude', lambda row: db(db.location.id == row.location.id
> ).select(db.location.point.st_x()).first()[db.location.point.st_x()]
>
> Paolo
>
> On Thursday, January 2, 2014 9:59:14 PM UTC+1, Christian Foster Howes 
> wrote:
>>
>> i bet that by the time your lambda is running the point has been 
>> converted to a string already.  can you see if that is true?  i'm not sure 
>> how to invoke db functions in a lambda of a virtual field. :(
>>
>> On Wednesday, January 1, 2014 5:50:54 PM UTC-8, User wrote:
>>>
>>> Suppose I have a table like:
>>>
>>> db.define_table('location',
>>>     Field(name, 'string'),
>>>     Field('point', 'geometry()')
>>> )
>>>
>>> I want to have the latitude and longitude as attributes also (whose 
>>> value can be derived from the point field).  So I try this:
>>>
>>> db.define_table('location',
>>>     Field(name, 'string'),
>>>     Field('point', 'geometry()'),
>>>     Field.Virtual('latitude', lambda row: row.location.point.st_x()),
>>>     Field.Virtual('longitude', lambda row: row.location.point.st_y()),
>>> )
>>>
>>> But it doesn't work and fails silently.  The model just doesn't have 
>>> latitude or longitude fields. I also tried with Field.Method but this 
>>> complains that 'point' is of typer str.
>>>
>>> I guess the complication is that st_x() translates into a database 
>>> function.  I'm thinking about parsing the point string which is of the form 
>>> "POINT(x y)" as a workaround but I'd rather use st_x if someone can show me 
>>> how.
>>>
>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
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