#25817: Unable to rename a field reference in foreign key 'to_field'
-------------------------------+-----------------------------
     Reporter:  snopoke        |      Owner:  nobody
         Type:  Uncategorized  |     Status:  new
    Component:  Migrations     |    Version:  1.7
     Severity:  Normal         |   Keywords:  to_field rename
 Triage Stage:  Unreviewed     |  Has patch:  0
Easy pickings:  0              |      UI/UX:  0
-------------------------------+-----------------------------
 Steps to reproduce:

 1. Create a model with a foreign key referencing another model's field via
 the 'to_field' arg.
 2. Generate the initial migration

 {{{#!python
 class Bar(models.Model):
     bar_id = models.CharField(max_length=255, db_index=True, unique=True)

 class Bazz(models.Model):
     bar = models.ForeignKey(Bar, to_field='bar_id')
 }}}

 3. Rename the field referenced in 'to_field' and create a migration for
 the change

 Rename 'bar_id' to 'external_id':
 {{{#!python
 class Bar(models.Model):
     external_id = models.CharField(max_length=255, db_index=True,
 unique=True)

 class Bazz(models.Model):
     bar = models.ForeignKey(Bar, to_field='external_id')
 }}}

 Migration:
 {{{#!python
     operations = [
         migrations.RenameField(
             model_name='bar',
             old_name='bar_id',
             new_name='external_id',
         ),
         migrations.AlterField(
             model_name='bazz',
             name='bar',
             field=models.ForeignKey(to='form_processor.Bar',
 to_field=b'external_id'),
             preserve_default=True,
         ),
     ]
 }}}

 4. Run the migration

 Error:
 {{{
 Traceback (most recent call last):
   File "./manage.py", line 73, in <module>
     execute_from_command_line(sys.argv)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 385, in
 execute_from_command_line
     utility.execute()
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/__init__.py", line 377, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/base.py", line 288, in run_from_argv
     self.execute(*args, **options.__dict__)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/commands/sqlmigrate.py", line 30, in
 execute
     return super(Command, self).execute(*args, **options)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/base.py", line 338, in execute
     output = self.handle(*args, **options)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/core/management/commands/sqlmigrate.py", line 61, in
 handle
     sql_statements = executor.collect_sql(plan)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/migrations/executor.py", line 82, in collect_sql
     migration.apply(project_state, schema_editor, collect_sql=True)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/migrations/migration.py", line 108, in apply
     operation.database_forwards(self.app_label, schema_editor,
 project_state, new_state)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/migrations/operations/fields.py", line 139, in
 database_forwards
     schema_editor.alter_field(from_model, from_field, to_field)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/backends/schema.py", line 445, in alter_field
     old_db_params = old_field.db_parameters(connection=self.connection)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1787, in db_parameters
     return {"type": self.db_type(connection), "check": []}
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1778, in db_type
     rel_field = self.related_field
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1684, in related_field
     return self.foreign_related_fields[0]
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1442, in
 foreign_related_fields
     return tuple(rhs_field for lhs_field, rhs_field in
 self.related_fields)
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1429, in related_fields
     self._related_fields = self.resolve_related_fields()
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/fields/related.py", line 1422, in
 resolve_related_fields
     else self.rel.to._meta.get_field_by_name(to_field_name)[0])
   File "/home/skelly/.virtualenvs/hq/local/lib/python2.7/site-
 packages/django/db/models/options.py", line 420, in get_field_by_name
     % (self.object_name, name))
 django.db.models.fields.FieldDoesNotExist: Bar has no field named 'bar_id'
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/25817>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/050.caeed29c84e4a8695a593228644ba6ff%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to