如何根据其中一个关键值将此连接查询的结果转换为dict?

时间:2016-07-29 16:17:30

标签: python psycopg2

对不起,我对这一切都有点新鲜。

我正在使用psycopg2,python和postgres。

我有两个表 - 用户和事件。我建立了多对多关系,因为一个事件可以有很多用户,用户可以加入很多事件。有一个名为UsersEvents的中间表,将User id与Event id匹配。我想获得类似于此的dict中的事件和用户列表:

php artisan server:run

我正在使用psycopg2运行这样的查询,以获取与之关联的事件和用户列表:

[
    {
        event_id: 1,
        event_name : 'event-name',
        joined : [
            {'username' : 'name'},
            {'username' : 'name'},
            {'username' : 'name'}
        ]
    },
    {
        event_id: 2,
        event_name : 'event2-name',
        joined : [
            {'username' : 'name2'},
            {'username' : 'name2'}
        ]
    }
]

让我回到这样的东西:

SELECT events.id, event_name, users.username
FROM events
JOIN usersevents on events_id = events.id
JOIN users on usersevents.users_id = users.id;

所以它很好地回收了我需要的信息,但现在我必须尝试弄清楚如何将它合并到上面的格式中。是否有更好的查询我正在尝试做什么,或者我应该循环遍历所有结果并尝试使用相同的事件名称合并结果?

编辑:我理解如何将结果作为dict返回,如评论中所指出的那样。我想获取具有重复事件名称的行,并将加入该事件的用户嵌套到单个事件对象的单个dict行中。

1 个答案:

答案 0 :(得分:0)

您希望按名称为每个事件构建数据结构。创建一个将名称映射到事件数据的dict。对于每一行,创建或更新事件的数据。最后,dict中的值是事件数据列表。

for id, event, user in results:
    event = events.setdefault(id, {'event_id': id, 'event_name': name, 'joined': []})
    event['joined'].append({'username': user})

data = list(events.values())