I had to migrate user models to a custom model on Django 2.2 and all of the answers I found required wiping tables or resetting them and re-applying migrations.
Here's I finally did and it's a bit more complicated but it doesn't screw with exisiting data.
1. Create your new app and before doing anything create an initial empty migration with
python manage.py makemigrations <myapp> --empty.
2. In the
0001_initial.py file, leave everything blank.
python manage.py migrate.
4. Now open the
django_migrations table in the database and find the
<myapp> 0001_initial row (or you can just insert this row).
5. Update the timestamp to equal the initial
auth 0001_initial row.
6. Now create your new
AbstractUser subclass, set the table name to
auth_users, but don't add any new fields yet, and update
AUTH_USER_MODEL in your settings
makemigrations again and copy the operations into
0001_initial.py since this is just a mirror of the auth_user table. Then delete the 0002 migration
8. Now add your custom fields to your model and
migrate should work normally.
Without doing it this way django wont allow the database to be migrated because of an InconsitentMigrationHistory error:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency <myapp>.0001_initial on database 'default'.
Looking at the
django_migrations table we can see the issue is that it was migrated with the initial
auth_0001 but changing the
AUTH_USER_MODEL updates the swappable dependency making it look for
<myapp>.0001_initial which was applied "out of order" because we just created it. Swapping the timesamp makes it all happy.