#24264: foreign key constraint error migrating integer pk to CharField
----------------------------+-------------------------------------
     Reporter:  timgraham   |                    Owner:  nobody
         Type:  Bug         |                   Status:  new
    Component:  Migrations  |                  Version:  1.8alpha1
     Severity:  Normal      |               Resolution:
     Keywords:              |             Triage Stage:  Accepted
    Has patch:  0           |      Needs documentation:  0
  Needs tests:  0           |  Patch needs improvement:  0
Easy pickings:  0           |                    UI/UX:  0
----------------------------+-------------------------------------

Comment (by MarkusH):

 I managed to construct a test_case for this issue.

 I made the FK span two apps to make sure it works across apps. Within the
 same app it boils down to the same problem.

 {{{#!diff
 diff --git a/tests/migrations/migrations_test_apps/alter_fk/__init__.py
 b/tests/migrations/migrations_test_apps/alter_fk/__init__.py
 new file mode 100644
 index 0000000..e69de29
 diff --git
 a/tests/migrations/migrations_test_apps/alter_fk/author_app/__init__.py
 b/tests/migrations/migrations_test_apps/alter_fk/author_app/__init__.py
 new file mode 100644
 index 0000000..e69de29
 diff --git
 
a/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0001_initial.py
 
b/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0001_initial.py
 new file mode 100644
 index 0000000..6017d16
 --- /dev/null
 +++
 
b/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0001_initial.py
 @@ -0,0 +1,20 @@
 +# -*- coding: utf-8 -*-
 +from __future__ import unicode_literals
 +
 +from django.db import models, migrations
 +
 +
 +class Migration(migrations.Migration):
 +
 +    dependencies = [
 +    ]
 +
 +    operations = [
 +        migrations.CreateModel(
 +            name='Author',
 +            fields=[
 +                ('id', models.AutoField(serialize=False,
 auto_created=True, primary_key=True)),
 +                ('name', models.CharField(max_length=50)),
 +            ],
 +        ),
 +    ]
 diff --git
 
a/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0002_alter_id.py
 
b/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0002_alter_id.py
 new file mode 100644
 index 0000000..0256b75
 --- /dev/null
 +++
 
b/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/0002_alter_id.py
 @@ -0,0 +1,20 @@
 +# -*- coding: utf-8 -*-
 +from __future__ import unicode_literals
 +
 +from django.db import models, migrations
 +
 +
 +class Migration(migrations.Migration):
 +
 +    dependencies = [
 +        ('author_app', '0001_initial'),
 +        ('book_app', '0001_initial'),  # Forces the book table to alter
 the FK
 +    ]
 +
 +    operations = [
 +        migrations.AlterField(
 +            model_name='author',
 +            name='id',
 +            field=models.CharField(max_length=10, primary_key=True),
 +        ),
 +    ]
 diff --git
 
a/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/__init__.py
 
b/tests/migrations/migrations_test_apps/alter_fk/author_app/migrations/__init__.py
 new file mode 100644
 index 0000000..e69de29
 diff --git
 a/tests/migrations/migrations_test_apps/alter_fk/book_app/__init__.py
 b/tests/migrations/migrations_test_apps/alter_fk/book_app/__init__.py
 new file mode 100644
 index 0000000..e69de29
 diff --git
 
a/tests/migrations/migrations_test_apps/alter_fk/book_app/migrations/0001_initial.py
 
b/tests/migrations/migrations_test_apps/alter_fk/book_app/migrations/0001_initial.py
 new file mode 100644
 index 0000000..eb1862d
 --- /dev/null
 +++
 
b/tests/migrations/migrations_test_apps/alter_fk/book_app/migrations/0001_initial.py
 @@ -0,0 +1,22 @@
 +# -*- coding: utf-8 -*-
 +from __future__ import unicode_literals
 +
 +from django.db import models, migrations
 +
 +
 +class Migration(migrations.Migration):
 +
 +    dependencies = [
 +        ('author_app', '0001_initial'),
 +    ]
 +
 +    operations = [
 +        migrations.CreateModel(
 +            name='Book',
 +            fields=[
 +                ('id', models.AutoField(serialize=False,
 auto_created=True, primary_key=True)),
 +                ('title', models.CharField(max_length=50)),
 +                ('author', models.ForeignKey('author_app.Author')),
 +            ],
 +        ),
 +    ]
 diff --git
 
a/tests/migrations/migrations_test_apps/alter_fk/book_app/migrations/__init__.py
 
b/tests/migrations/migrations_test_apps/alter_fk/book_app/migrations/__init__.py
 new file mode 100644
 index 0000000..e69de29
 diff --git a/tests/migrations/test_executor.py
 b/tests/migrations/test_executor.py
 index 12385ac..30de553 100644
 --- a/tests/migrations/test_executor.py
 +++ b/tests/migrations/test_executor.py
 @@ -368,6 +368,41 @@ class ExecutorTests(MigrationTestBase):
          ]
          self.assertEqual(call_args_list, expected)

 +    @override_settings(
 +        INSTALLED_APPS=[
 +            "migrations.migrations_test_apps.alter_fk.author_app",
 +            "migrations.migrations_test_apps.alter_fk.book_app",
 +        ]
 +    )
 +    def test_alter_id_type_with_fk(self):
 +        try:
 +            executor = MigrationExecutor(connection)
 +            self.assertTableNotExists("author_app_author")
 +            self.assertTableNotExists("book_app_book")
 +            # Apply initial migrations
 +            executor.migrate([
 +                ("author_app", "0001_initial"),
 +                ("book_app", "0001_initial"),
 +            ])
 +            self.assertTableExists("author_app_author")
 +            self.assertTableExists("book_app_book")
 +            # Rebuild the graph to reflect the new DB state
 +            executor.loader.build_graph()
 +
 +            # Apply PK type alteration
 +            executor.migrate([("author_app", "0002_alter_id")])
 +
 +            # Rebuild the graph to reflect the new DB state
 +            executor.loader.build_graph()
 +        finally:
 +            # Cleanup
 +            executor.migrate([
 +                ("author_app", None),
 +                ("book_app", None),
 +            ])
 +            self.assertTableNotExists("author_app_author")
 +            self.assertTableNotExists("book_app_book")
 +

  class FakeLoader(object):
      def __init__(self, graph, applied):
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/24264#comment:4>
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/067.edf2c94c2f6fcf51a3bcf42bddc128b6%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to