If you would rather start from an empty database and re-run all migrations, you should drop and recreate the database and then run migrate instead.
You can achieve this with:
./manage.py dbshell <<< 'drop database foo; create database foo <charset utf8mb4 or any other options you need>;'
./manage.py migrate
I've wrapped this up in the big application I work on with a separate management command that basically does:
assert settings.DEBUG
cursor.execute('drop database; create database...')
call_command('migrate')
I think this solves your problem better than any change to migrations. Executing "just one migration out of order" is not generally possible unless it's strictly a data migration.