I haven't used Django except as an ORM and it was a terrible experience. Anytime I wanted to update an existing relationship, it was a pain. I've heard a lot of good stuff about it when used as a web framework but I was really baffled by the ORM.
Actually writing the the tables was very freeing, no more separation and surprises in the translation between a single model and the multiple tables it can create.
For each new object, we wrote a SQLAlchemy Table object, a domain entity object, and optionally an adapter if you need to map field names between the two. The 300 lines of repo library code did the rest.
A little boilerplate, but no need for a ton of impenetrable, hyper-dynamic ORM code.
Alembic can autogenerate migrations from the SQLALchemy Table objects