﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
26794	Migrating ForeignKey to OneToOneField creates extra index on PostgreSQL	Jon Dufresne	nobody	"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'),
        ),
    ]
}}}"	Bug	closed	Migrations	dev	Normal	duplicate			Unreviewed	0	0	0	0	0	0
