Wednesday, June 17, 2015

Re: ValueError during migrations.RunPython to create OneToOne records in new model

Hi Gergely,

You need to use apps.get_model() instead of get_user_model(). See https://docs.djangoproject.com/en/1.8/topics/migrations/#data-migrations

/Markus

On June 17, 2015 12:48:48 PM GMT+02:00, Gergely Polonkai <gergely@polonkai.eu> wrote:
>Hello,
>
>I have created a new model called Settings, which has a
>OneToOneField(User,
>primary_key=True) field. After the automatically created
>migrations.CreateModel() invocation I added a RunPython line that runs
>this
>function:
>
>def create_user_settings(apps, schema_editor):
> User = get_user_model()
> Settings = apps.get_model('accounts', 'Settings')
>
> for user in User.objects.all():
> Settings.objects.get_or_create(user=user) # This is line 13
>
>When running this migration, I get the following error:
>
>Traceback (most recent call last):
>
> File "manage.py", line 10, in <module>
>
> execute_from_command_line(sys.argv)
>
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/core/management/__init__.py",
>line 338, in execute_from_command_line
> utility.execute()
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/core/management/__init__.py",
>line 330, in execute
> self.fetch_command(subcommand).run_from_argv(self.argv)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/core/management/base.py",
>line 390, in run_from_argv
> self.execute(*args, **cmd_options)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/core/management/base.py",
>line 441, in execute
> output = self.handle(*args, **options)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py",
>line 221, in handle
> executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/migrations/executor.py",
>line 110, in migrate
> self.apply_migration(states[migration], migration, fake=fake,
>fake_initial=fake_initial)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/migrations/executor.py",
>line 147, in apply_migration
> state = migration.apply(state, schema_editor)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/migrations/migration.py",
>line 115, in apply
> operation.database_forwards(self.app_label, schema_editor, old_state,
>project_state)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/migrations/operations/special.py",
>line 183, in database_forwards
> self.code(from_state.apps, schema_editor)
> File "/home/polesz/Projects/dem/accounts/migrations/0003_settings.py",
>line 13, in create_user_settings
> Settings.objects.get_or_create(user=user)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/manager.py",
>line 127, in manager_method
> return getattr(self.get_queryset(), name)(*args, **kwargs)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/query.py",
>line 405, in get_or_create
> return self.get(**lookup), False
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/query.py",
>line 325, in get
> clone = self.filter(*args, **kwargs)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/query.py",
>line 679, in filter
> return self._filter_or_exclude(False, *args, **kwargs)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/query.py",
>line 697, in _filter_or_exclude
> clone.query.add_q(Q(*args, **kwargs))
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/sql/query.py",
>line 1306, in add_q
> clause, require_inner = self._add_q(where_part, self.used_aliases)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/sql/query.py",
>line 1333, in _add_q
> current_negated=current_negated, connector=connector,
>allow_joins=allow_joins)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/sql/query.py",
>line 1175, in build_filter
> self.check_related_objects(field, value, opts)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/sql/query.py",
>line 1070, in check_related_objects
> self.check_query_object_type(value, opts)
> File
>"/home/polesz/Projects/dem/venv/lib/python2.7/site-packages/django/db/models/sql/query.py",
>line 1054, in check_query_object_type
> (value, opts.object_name))
>ValueError: Cannot query "polesz": Must be "User" instance.
>
>While debugging, it turns out that the value of the user variable is
>indeed
>a User instance. Do I miss some key information here? Maybe apps are
>not
>fully initialized when I run migrations?
>
>Best,
>Gergely

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/B7FD7C28-2479-4713-B08C-BCEA592CF509%40markusholtermann.eu.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment