Opened 11 years ago
Last modified 11 years ago
#24447 closed Bug
Migrations do not execute create_fk_sql() when adding a foreign key to a field — at Initial Version
| Reported by: | Jean-Louis Fuchs | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 1.7 |
| Severity: | Normal | Keywords: | |
| Cc: | Markus Holtermann | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | yes |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
Migrations failed when introducing foreign keys on existing fields.
Pull request: https://github.com/django/django/pull/4235
Branch with fix: https://github.com/ganwell/django/tree/master_missing_create_fk_sql
Branch with unittest but no fix: https://github.com/ganwell/django/tree/master_missing_create_fk_sql_fail
Consider following model:
class ForeignKeyTest(models.Model):
id = models.AutoField(primary_key=True)
customer = models.IntegerField()
class Customer(models.Model):
id = models.AutoField(primary_key=True)
Then it gets migrated to this:
class ForeignKeyTest(models.Model):
id = models.AutoField(primary_key=True)
customer = models.ForeignKey('Customer')
class Customer(models.Model):
id = models.AutoField(primary_key=True)
The second migration won't create the foreign key. This does not fail with sqlite! Because these migrations are handled differently. It will fail with MySQL and probably Postgres too. I wrote a unittest and tested it with MySQL: master_missing_create_fk_sql_fail fails and master_missing_create_fk_sql is ok.
The code didn't detect this case - if old_field.rel doesn't exist alter_field() must always create the foreign key and ONLY if .rel exists it must check .db_constraint, too. Since no .rel also means there was no foreign key before.
I will of course redo the pull request to get clean history. I also fixed this in 1.7.