#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.