Opened 7 years ago
Last modified 5 years ago
#29000 closed Bug
RenameModel does not rename M2M column when run after AlterField/RenameField — at Version 3
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 (last modified by )
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 its 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.
Change History (3)
follow-up: 2 comment:1 by , 7 years ago
Component: | Uncategorized → Migrations |
---|---|
Type: | Uncategorized → Bug |
comment:2 by , 7 years ago
Sorry, should have just done that from the start. Tested in Django 2.0.1, and the issue still occurs.
comment:3 by , 7 years ago
Description: | modified (diff) |
---|---|
Version: | 1.11 → 2.0 |
Please test with Django 2.0 as there are changes there which may resolve this.