Opened 8 years ago

Closed 8 years ago

#26794 closed Bug (duplicate)

Migrating ForeignKey to OneToOneField creates extra index on PostgreSQL

Reported by: Jon Dufresne Owned by: nobody
Component: Migrations Version: dev
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

Start with the models:

class A(models.Model):
    pass

class B(models.Model):
    orig_onetoone = models.OneToOneField(A, on_delete=models.PROTECT, related_name='+')
    orig_fk = models.ForeignKey(A, on_delete=models.PROTECT, related_name='+')

Run makemigrations, then change orig_fk to a OneToOneField:

class A(models.Model):
    pass

class B(models.Model):
    orig_onetoone = models.OneToOneField(A, on_delete=models.PROTECT, related_name='+')
    orig_fk = models.OneToOneField(A, on_delete=models.PROTECT, related_name='+')

Run makemigrations again.

Now run migrate to create the database tables. The table created for model B:

\d testapp_b
                              Table "public.testapp_b"
      Column      |  Type   |                       Modifiers                        
------------------+---------+--------------------------------------------------------
 id               | integer | not null default nextval('testapp_b_id_seq'::regclass)
 orig_fk_id       | integer | not null
 orig_onetoone_id | integer | not null
Indexes:
    "testapp_b_pkey" PRIMARY KEY, btree (id)
    "testapp_b_orig_fk_id_68b3dcb4_uniq" UNIQUE CONSTRAINT, btree (orig_fk_id)
    "testapp_b_orig_onetoone_id_key" UNIQUE CONSTRAINT, btree (orig_onetoone_id)
    "testapp_b_ca8b5791" btree (orig_fk_id)
Foreign-key constraints:
    "testapp_b_orig_fk_id_68b3dcb4_fk_testapp_a_id" FOREIGN KEY (orig_fk_id) REFERENCES testapp_a(id) DEFERRABLE INITIALLY DEFERRED
    "testapp_b_orig_onetoone_id_2353312c_fk_testapp_a_id" FOREIGN KEY (orig_onetoone_id) REFERENCES testapp_a(id) DEFERRABLE INITIALLY DEFERRED

Notice the column orig_fk has two indexes while the column orig_onetoone has only a single index.

As these two columns are now described in the Python model identically, I expect them to have the same number of indexes.

I created a test project with all the necessary migrations and models used to produce these results: https://github.com/jdufresne/djtest-fk-to-1to1

Migrations:

0001

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='A',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ],
        ),
        migrations.CreateModel(
            name='B',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('orig_fk', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='testapp.A')),
                ('orig_onetoone', models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='testapp.A')),
            ],
        ),
    ]


0002

class Migration(migrations.Migration):

    dependencies = [
        ('testapp', '0001_initial'),
    ]

    operations = [
        migrations.AlterField(
            model_name='b',
            name='orig_fk',
            field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='testapp.A'),
        ),
    ]

Change History (1)

comment:1 by Tim Graham, 8 years ago

Resolution: duplicate
Status: newclosed

Duplicate of #26090

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