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

117 views
Skip to first unread message

Gergely Polonkai

unread,
Jun 17, 2015, 6:49:50 AM6/17/15
to django...@googlegroups.com
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

Markus Holtermann

unread,
Jun 17, 2015, 7:15:24 AM6/17/15
to django...@googlegroups.com
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

Gergely Polonkai

unread,
Jun 17, 2015, 7:32:12 AM6/17/15
to django...@googlegroups.com
Hello Markus,

thanks for the pointer. Just for the record, if you want to use it in a reusable app, you should do this:

User = apps.get_model(django.conf.settings.AUTH_USER_MODEL)

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...@googlegroups.com.
To post to this group, send email to django...@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.

Reply all
Reply to author
Forward
0 new messages