Поменяйте местами порядок соединений. И ваш сырой SQL, и запрос страдают от одного и того же, поэтому вместо этого:
organizations_query = session.query(O.id, ...) \
.join(S) \
.join(A) \
...
предложения WHERE, которые вы добавляете в
...
.filter(O.identifier == S.organization_id) \
.filter(A.identifier == S.activities_area_id) \
...
похоже, что вы пытаетесь использовать синтаксис предварительного соединения ANSI, но смешиваетесь с соединениями ANSI. Они полностью избыточны в том смысле, что SQLAlchemy может выводить предложения ON для объединений на основе отношений внешнего ключа между моделями. Необработанный SQL нарушается аналогичным образом, что
FROM
organizations O
JOIN activities_area A JOIN ...
вообще не имеет предложения ON между O и A, кроме того, нет очевидного способа присоединиться к ним без предварительного присоединения к таблице ассоциации. Всего:
organizations_query = session.query(O.id, O.label, A.name) \
.join(S) \
.join(A) \
.order_by(O.label) \
.all()