Opened 8 years ago
Last modified 8 years ago
#27860 closed Bug
Changing a CharField to a ForeignKey explodes when migrating in PostgreSQL — at Initial Version
Reported by: | Daniel Quinn | Owned by: | nobody |
---|---|---|---|
Component: | Migrations | Version: | 1.10 |
Severity: | Normal | Keywords: | PostgreSQL |
Cc: | Triage Stage: | Accepted | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
If I have a model that looks like this:
class MyModel(models.Model): my_field = models.CharField(max_length=128, db_index=True)
makemigrations
will create a migration that looks like this:
migrations.CreateModel( name='MyModel', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('my_field', models.CharField(db_index=True, max_length=128)), ], ),
However, if I later change the field to a ForeignKey
:
class MyModel(models.Model): my_field = models.ForeignKey("alpha.MyOtherModel", blank=True)
makemigrations
will create this:
migrations.AlterField( model_name='mymodel', name='my_field', field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='alpha.MyOtherModel'), ),
...which explodes in PostgreSQL (but not SQLite or MySQL) with this:
psycopg2.ProgrammingError: operator class "varchar_pattern_ops" does not accept data type integer
The fix (at least for my case) was to manually break up the AlterField
into separate RemoveField
and AddField
steps like this:
migrations.RemoveField( model_name='mymodel', name='my_field', ), migrations.AddField( model_name='mymodel', name='my_field', field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='alpha.MyOtherModel'), ),
I ran into this on my own GPL project, and the issue history wherein we found and fixed the problem is here: https://github.com/danielquinn/paperless/issues/183