sel = select([Address.user_id, func.count(Address.id).label('count')]).group_by(Address.user_id).alias() print User.query.outerjoin(('addresses', sel)).add_column(sel.c.count).all() SELECT users.id AS users_id, users.name AS users_name, anon_1.count AS anon_1_count FROM users LEFT OUTER JOIN (SELECT addresses.user_id AS user_id, count(addresses.id) AS count FROM addresses GROUP BY addresses.user_id) AS anon_1 ON users.id = anon_1.user_id ORDER BY users.oid