#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 [email protected].
To post to this group, send email to [email protected].
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