On Sunday, August 2, 2015 at 9:18:11 AM UTC-7, P Page-McCaw wrote:
>
> I am having a hard time understanding how to get values from a row in a 
> view. I think I am being really dim. (It would really help us amateurs to 
> have a more full description of how to do database queries. Really I need 
> "The Very Stupid Person's Guide to..." because I read the guide and then do 
> what it says (or so I think) and can't get it to work.
>
> The generic problem is how to retrieve data from a linked table in a view. 
> I have problems (this tells you how pathetic I am [really though I'm a good 
> biologist]) both where I want to traverse from the table that carries the 
> 'reference other_table' field and from the target table. I keep thinking I 
> get the syntax, but the next time I try, fail.
>
> I have tried many things and though I can get the entire row to show up on 
> the web page with many variants of:
> {{ =db.table_1_name(m.field_name) }}
>
> This shows in the page as  <Row {'other_table_field_name', 'value'}> with 
> the whole row rendered as text. So clearly the row is accessed in the view.
>
> But what I want is table_1_name.'other_table_field_name' and
> {{ =db.table_1_name(m.field_name).field_name }}
> returns an error: can't get field_name from None Type and m.field_name 
> yields the id for the correct reference to the table_1_name. m is the row 
> of the set being iterated through.
>
> Somewhere, something is being gently and kindly coerced. But I am not 
> smart enough to figure out what is happening.
>
> Thanks
>


While we're waiting for some more details, as Anthony and Jorge requested, 
note that a query typically returns a Rows objects, which is a collection 
of Row objects (essentially a list() of Row objects.  

It just occurred to me that the way you wrote your questions makes it look 
like you're trying to do queries in the view.  It is much more natural to 
do queries in a controller, and my example fits with doing things that way. 
[1]

You'd do something like this to print the second (0 +1) and fifth Row in a 
Rows object:

results = db(table_1_name().select(table_1_name.field_name)
print results[1]
print results[4]


Now we only selected 1 column in this example, but a Row object is 
essentially a Python dictionary, so if we had
 multiple fields,

results = db(table_1_name().select(table_1_name.field1_name, 
table_1_name.field2_name)
print results[1]["field1_name"]


would use the string "field1_name" as the key, and print the value of 
field1 in the second Row object returned.

This should look familiar if you've been reading
<URL:http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#select>

The methods ".first()" and ".last()" can pick up the first Row object and 
last Row object without your knowing how many Row objects there are; nice 
convenience tools.

[1] You can also do things in the web2py shell ('python web2py.py -S 
appname', but you need to invoke your model declarations explicitly (I did 
cut-and-paste of the 'db = ' line of db.py, and then the 'db.define _table' 
line of the particular table I was using for checking my answers.

Welcome aboard the web2py cruise; I hope this helps. 

Dave
/dps


-- 
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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to