ValueError in Django migration
I’ve recently started developing in Python+Django again for a personal site that I’m working on and for far too long today I’ve been pulling my hair out when trying to write what should be a fairly simple migration using migrations.RunPython() to generate a default value to assign to a new OneToOneField column.
The rather confusing error message that I was receiving is:
ValueError: Cannot assign "<User: blah>": "Profile.account" must be a "User" instance.
This seems to be the same problem described at http://stackoverflow.com/questions/29700001/valueerror-cannot-assign-user-issue-on-my-onetoonefield-relationship, but nothing mentioned in that post worked.
I was hopeful when I came across https://code.djangoproject.com/ticket/24282 that this was a known issue, but alas whilst similar it’s not exactly the same problem and that bug was closed over a year ago. Back to square one!
What was particularly confusing was that the same code seemed to work as expected when run in the Django shell:
from foo.models import Profile, Article
from django.contrib.auth.models import User
first_superuser = User.objects.all().filter(is_superuser=True).first()
default_profile = Profile(account=first_superuser, biography="")
default_profile.save()
After a lot of fiddling, I eventually realised that the way which I was importing the User model from the built in Django auth system was wrong for a migration and so I replaced:
from django.contrib.auth.models import User
with:
User = apps.get_model('auth', 'user')
And now the migration finally works as expected. 🙂