Opened 8 years ago

Last modified 7 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

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top