#26794: Migrating ForeignKey to OneToOneField creates extra index on PostgreSQL
----------------------------+--------------------
     Reporter:  jdufresne   |      Owner:  nobody
         Type:  Bug         |     Status:  new
    Component:  Migrations  |    Version:  master
     Severity:  Normal      |   Keywords:
 Triage Stage:  Unreviewed  |  Has patch:  0
Easy pickings:  0           |      UI/UX:  0
----------------------------+--------------------
 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'),
         ),
     ]
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/26794>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.add9ba80a3002ae996aab1463617771e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to