I have not. I've poked around with a few Django projects, so I have some perspective. Django makes a lot of assumptions about how you're implementing, which has, in my experience let to interesting constraints on operating system versions, hosting configurations, and more.
In general, this list recommends starting with:
Start simple, and build up from there.
You should even see if you can get by without an ORM. If you are only targeting a single database, then ORM won't really get you far, and will introduce a layer of indirection that can trigger performance issues, and difficulty reasoning about the best way to accomplish something. If you're not planning on migrating between database implementations, then just bind to one. If you do change later, it isn't that hard to provide overrides for specific databases, should you decide you need to support multiples.
I know with my experience with the Django ORM, I had a huge problem with performance that wasn't easy to resolve, because various object relationships required a save (and commit) before adding further objects. Without the required commit - with direct access to the database, I could have taken what turned into hundreds or thousands of commits, and done the entire operation in one transaction, thus making the entire operation take less than a tenth of the time.
As for the migration question, there's a very simple pattern to follow - store the "version" of your database schema in the database. Whenever you change your database, write the appropriate SQL statement to make the change as well. When your app starts up, run the code to migrate the database from the old version to the new, if any migration is required.
My suggestion is to look at a large-ish open source project that might be similar to your requirements, and poke around the code, see whether it makes sense to you.
Eric.