Opened 7 years ago
Last modified 5 years ago
#29000 closed Bug
RenameModel does not rename M2M column when run after AlterField/RenameField — at Initial Version
Reported by: | David Nelson Adamec | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 2.0 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Encountered this on a project at work. I have some models like so:
class ModelA(models.Model): name_renamed = models.CharField(max_length=10) class ModelBRenamed(models.Model): a = models.ForeignKey(ModelA, null=True) class ModelC(models.Model): b_set = models.ManyToManyField(ModelBRenamed)
I have a migration 0002_renamefield to rename a field on ModelA:
class Migration(migrations.Migration): dependencies = [ ('myapp', '0001_initial'), ] operations = [ migrations.RenameField( model_name='modela', old_name='name', new_name='name_renamed', ), ]
Then a migration 0003_renamemodel to rename ModelB:
class Migration(migrations.Migration): dependencies = [ ('myapp', '0002_renamefield'), ] operations = [ migrations.RenameModel( old_name='ModelB', new_name='ModelBRenamed', ), ]
If the two migrations are run together, then the modelb_id
column in myapp_modelc_b_set
will not be renamed to modelbrenamed_id
. However, if I run the migrations one at a time, the column will be renamed as expected.
I think this is related to #27737. When ModelA is reloaded in the RenameField migration, ModelB is reloaded due to it's foreign key but is missing its relationship to ModelC. When the RenameModel migration is run, ModelC is not included in ModelB's related_objects, so the through table's column is not renamed.
I've reproduced this using Django 1.11 on either MySQL or SQLite.