Пока писал вопрос в Q&A разобрался в ORM.
Конкретно в моем случае запрос можно переписать c JOIN на WHERE:
SELECT * FROM pybb_forum as ff,guardian_groupobjectpermission as gg, auth_permission as pp
WHERE codename = 'view_forum'
AND gg.group_id in (1,2,3)
AND gg.content_type_id = 9
AND ff.id = gg.object_pk
AND gg.permission_id = pp.id;
a WHERE уже довольно просто подставить в objects.extra:
Forum.objects.extra(
tables = ['guardian_groupobjectpermission', 'auth_permission'],
where = [""" codename = "view_forum"
AND guardian_groupobjectpermission.group_id in (1,2,3)
AND guardian_groupobjectpermission.content_type_id = 9
AND pybb_forum.id = guardian_groupobjectpermission.object_pk
AND guardian_groupobjectpermission.permission_id = auth_permission.id
"""]
)
Единственная проблема — совсем пропала читабельность такого запроса.