Hi Anthony,

Thanks for your excellent example and explanation.
You're right about the problem with the field names, luckily the problem 
occurs only in this example, not in production code, but just out of 
curiosity, would using "with_alias()" help?

Thanks again for all your help. It made a huge difference!
Ricardo.

On Thursday, October 12, 2017 at 3:56:10 PM UTC+1, Anthony wrote:
>
> You can call .as_dict() on a row object inside an iteration through 
> .render(). Here is a one-liner to replace all your code:
>
> json.dumps(dict(data=[{k: v for sub_row in row.as_dict().values() for (k, 
> v) in sub_row.iteritems()}
>                       for row in persons.render()]))
>
> The list comprehension iterates through persons.render(), which yields a 
> Row object for each record (with the represent functions applied to each 
> field). For each Row object, there is then a dictionary comprehension with 
> two "for" clauses -- the first converts the Row to a nested dict via 
> .as_dict and then uses .values() to extract the two nested dicts into a 
> list containing the two dicts, and the second then calls .iteritems() on 
> each of the dicts in order to generate a new dictionary.
>
> Note, you still have a problem -- you have two fields with the same name 
> (i.e., "name"), so in the combined dictionary, the second will overwrite 
> the first.
>
> Anthony
>
> On Thursday, October 12, 2017 at 5:19:26 AM UTC-4, Ricardo Oliveira wrote:
>>
>> Hi Anthony,
>>
>> Thanks for your reply.
>> That was also my initial solution.
>> Problem is I need to use render() in order to force the lambdas of the 
>> table fields to be executed, and I can't seem to find a way to combine 
>> render() and as_dict(), that's why I used the approach of iterating through 
>> the Rows.
>>
>> Is there some way to do this? That would also work.
>>
>> Thanks again.
>> Ricardo.
>>
>>
>> On Wednesday, October 11, 2017 at 11:05:56 PM UTC+1, Anthony wrote:
>>>
>>> The problem is here:
>>>  
>>>
>>>>             for field in person[table]:
>>>>
>>>
>>> person[table] is a Row object, and when the Row object includes the 
>>> record ID, it also includes the special .update_record and .delete_record 
>>> attributes. So, you'll either have to specify the fields explicitly, or 
>>> check the types (the Row.as_dict method takes the latter approach).
>>>
>>> Anthony
>>>
>>

-- 
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