Opened 9 years ago

Last modified 9 years ago

#24893 closed Bug

Django migrations don't add unique constraint for field that is changed from primary_key to unique — at Version 1

Reported by: Jacek Bzdak Owned by: nobody
Component: Migrations Version: 1.8
Severity: Release blocker Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Jacek Bzdak)

This is related to #24892 and uses the same code (I have attached sample project there)

Copy-pasted description of problem:

To cut long story short: in a small application I had models using domain level primary keys, that were strings, I wanted to introduce synthetic primary keys.

Here are models before migration (I have updated int_pk to be unique).

class Foo(models.Model):

  string_pk = models.CharField(
    max_length=10,
    primary_key= True
  )

  int_pk = models.IntegerField(
    null=True
  )

  class Meta:

    db_table = "FOO"

Models after migration:

class Foo(models.Model):

  string_pk = models.CharField(
    max_length=10,
    unique = True
  )

  int_pk = models.AutoField(
    primary_key=True
  )

  class Meta:

    db_table = "FOO"

Generated migration:

class Migration(migrations.Migration):

    dependencies = [
        ('testapp', '0002_foo_int_pk'),
    ]

    operations = [
        migrations.AlterField(
            model_name='foo',
            name='int_pk',
            field=models.AutoField(primary_key=True, serialize=False),
        ),
        migrations.AlterField(
            model_name='foo',
            name='string_pk',
            field=models.CharField(max_length=10, unique=True),
        ),
    ]

I have changed field string_pk from primary_key=True to unique=True, generated migration (when I manually fixed error from #24892) didn't create unique constraint (previously there were a primary key constraint, that was dropped but there were no unique key generated).

This can be worked-around by generating another migration with two migrations.AlterField one that sets unique=False and another that sets unique=True.

Change History (1)

comment:1 by Jacek Bzdak, 9 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top