#34333: Django migrations adds constraint before adding field
-------------------------------------+-------------------------------------
     Reporter:  Raphael Beekmann     |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Migrations           |                  Version:  4.1
     Severity:  Normal               |               Resolution:
     Keywords:  migration,           |             Triage Stage:
  constraint, field                  |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Raphael Beekmann):

 * status:  closed => new
 * resolution:  needsinfo =>


Old description:

> Hello,
>
> I have a model, already created through previous migrations, and in a new
> migration I added a new field with a UniqueConstraint.
> The model looks like this (the new field is 'type') :
>

> {{{
> class Model(models.Model):
>     name = models.CharField()
>     date = models.DateField()
>     type = models.ForeignKey(OtherModel)
>
>     class Meta:
>         constraints = (
>             models.UniqueConstraint(fields=('date', 'type'),
> name='unique_date_for_type'),
>         )
> }}}
>
> When I run the makemigrations script it adds first the constraint and
> then the new field. That occurs an error when executing the migration :
>
> {{{
> django.core.exceptions.FieldDoesNotExist: DailyTask has no field named
> 'type'
> }}}
>
> I have to manually move the adds of the constraint before the adds of the
> new field in the migration file to make it work.

New description:

 Hello,

 I have a model, already created through previous migrations, and in a new
 migration I added a new field with an UniqueConstraint. The migrations
 script try to create the constraint first and then the new field,
 resulting an error :

 {{{
 django.core.exceptions.FieldDoesNotExist: NewModel has no field named
 'category'
 }}}


 To reproduce the bug :

 1. Create a project with two models linked together with a One-to-Many
 relation and an unique constraint :

 {{{
 class Type(models.Model):
     name = models.CharField(max_length=10)


 class Model(models.Model):
     name = models.CharField(max_length=10)
     type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True)
     date = models.DateField(auto_now=True)

     class Meta:
         constraints = (
             models.UniqueConstraint(fields=('date', 'type'),
 name='unique_type_for_date'),
         )
 }}}

 2. Create a migration file with `manage.py makemigrations`

 3. Add a new model with another One-to-Many relation and unique
 constraint. The models looks like this :


 {{{
 class Type(models.Model):
     name = models.CharField(max_length=10)


 class Category(models.Model):
     name = models.CharField(max_length=10)


 class Model(models.Model):
     name = models.CharField(max_length=10)
     type = models.ForeignKey(Type, on_delete=models.SET_NULL, null=True)
     category = models.ForeignKey(Category, on_delete=models.SET_NULL,
 null=True)
     date = models.DateField(auto_now=True)

     class Meta:
         constraints = (
             models.UniqueConstraint(fields=('date', 'type'),
 name='unique_type_for_date'),
             models.UniqueConstraint(fields=('date', 'category'),
 name='unique_category_for_date'),
         )
 }}}


 4. Create a new migration file. The order of the migration's steps are
 incorrect and the migration crash :


 {{{
 class Migration(migrations.Migration):

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

     operations = [
         migrations.CreateModel(
             name='Category',
             fields=[
                 ('id', models.BigAutoField(auto_created=True,
 primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=10)),
             ],
         ),
         migrations.AddConstraint(
             model_name='model',
             constraint=models.UniqueConstraint(fields=('date',
 'category'), name='unique_category_for_date'),
         ),
         migrations.AddField(
             model_name='model',
             name='category',
             field=models.ForeignKey(null=True,
 on_delete=django.db.models.deletion.SET_NULL, to='app.category'),
         ),
     ]
 }}}

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34333#comment:2>
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701864c9ce949-acd76483-19f6-410b-9218-30967f0447f4-000000%40eu-central-1.amazonses.com.

Reply via email to