Opened 9 years ago
Closed 9 years ago
#26404 closed Bug (duplicate)
Change of primary key field does not update foreign keys in migration
Reported by: | Maciej Pawlisz | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.9 |
Severity: | Normal | Keywords: | |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Changing from:
class ModelA(models.Model): new_pk = models.IntegerField() class ModelB(models.Model): model_a = models.ForeignKey(ModelA)
To:
class ModelA(models.Model): new_pk = models.IntegerField(primary_key=True) class ModelB(models.Model): model_a = models.ForeignKey(ModelA)
Results in migration:
class Migration(migrations.Migration): dependencies = [ ('test_app', '0001_initial'), ] operations = [ migrations.RemoveField( model_name='modela', name='id', ), migrations.AlterField( model_name='modela', name='new_pk', field=models.IntegerField(primary_key=True, serialize=False), ), ]
ForeignKey model_a
in ModelB
is not altered, so table description at least in sqlite is wrong:
CREATE TABLE "test_app_modelb" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "model_a_id" integer NOT NULL REFERENCES "test_app_modela" ("id"))
so connection.check_constraints(['test_app_modelb'])
fails with exception
OperationalError: no such column: REFERRED.id
making it impossible to load fixture data.
Manually adding Operation:
migrations.AlterField( model_name='modelb', name='model_a', field=models.ForeignKey(on_delete=models.deletion.CASCADE, to='test_app.ModelA'), )
at the end of migration resolves this problem.
Note:
See TracTickets
for help on using tickets.
Duplicate of #25012