#27267: Renaming a primary key fails with "cannot drop constraint on table 
because
other objects depend on it"
--------------------------------+--------------------------------------
     Reporter:  Melvyn Sopacua  |                    Owner:  nobody
         Type:  Bug             |                   Status:  closed
    Component:  Migrations      |                  Version:  1.8
     Severity:  Normal          |               Resolution:  needsinfo
     Keywords:                  |             Triage Stage:  Unreviewed
    Has patch:  0               |      Needs documentation:  0
  Needs tests:  0               |  Patch needs improvement:  0
Easy pickings:  0               |                    UI/UX:  0
--------------------------------+--------------------------------------

Comment (by Stephan Doliov):

 For what it is worth, I encountered the same error.
 I am using Django 2.01 and Postgres 9.6

 I have a workaround for the problem simply by declaring my migration to be
 non-atomic
 {{{    atomic = False}}}

 Here is what it looks like in practice for me. For certain migrations, I
 initialize them with data; if I undo the migration, I also want to clear
 out that seed data, in the right order as all my OneToOneFields have
 models.PROTECT declared, like so
 {{{
     guid = models.OneToOneField(Guid, on_delete=models.PROTECT,
 primary_key=True)
 }}}

 so then my migrations looks like
 {{{
 # Generated by Django 2.0.2 on 2018-03-07 23:52

 from django.core import management
 from django.db import migrations, models

 import django.db.models.deletion

 from dim.models import Guid, Role

 def create_fixture(apps, schema_editor):
     management.call_command('dumpdata', 'dim.Role', format='json',
                             indent=4,
 output='dim/fixtures/000002_dim_role.json'
                            )

 def init_data(apps, schema_editor):
     Role.objects.create(guid=Guid.objects.create(), name="Basic Consumer")
     Role.objects.create(guid=Guid.objects.create(), name="Basic
 Publisher")

 def clear_data(apps, schema_editor):
     import pdb
     pdb.set_trace()
     for role in Role.objects.all():
         guid = role.guid.guid
         role.delete(purge=True)
         Guid.objects.get(guid=guid).delete(purge=True)
     migrations.RunSQL("drop table dim_role cascade")

 class Migration(migrations.Migration):

     atomic = False

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

     operations = [
         migrations.CreateModel(
             name='Role',
             fields=[
                 ('guid',
 models.OneToOneField(on_delete=django.db.models.deletion.PROTECT,
 primary_key=True, serialize=False, to='dim.Guid')),
                 ('name', models.CharField(max_length=64, unique=True,
 verbose_name='name')),
                 ('created_ts', models.DateTimeField(auto_now_add=True)),
                 ('updated_ts', models.DateTimeField(auto_now=True,
 null=True)),
                 ('deleted_ts', models.DateTimeField(null=True)),
             ],
             options={
                 'verbose_name': 'role',
                 'verbose_name_plural': 'roles',
                 'db_table': 'dim_role',
             },
         ),
         migrations.RunPython(init_data, reverse_code=clear_data),
         migrations.RunPython(create_fixture,
 reverse_code=migrations.RunPython.noop)
     ]
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/27267#comment:15>
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/072.fd60ae52cb1b6cbdd522a645ad774546%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to