﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
27768	makemigrations uses unnecessary AddField for ForeignKey depending on model name	Ed Morley	nobody	"Using Django master, for this model `makemigrations` generates an inefficient migrations file, which uses a combination of `CreateModel` and `AddField`, rather than just using a single `CreateModel` operation.

{{{#!python
class Zzz(models.Model):
    pass

class Foo(models.Model):
    fk = models.ForeignKey(Zzz, on_delete=django.db.models.deletion.CASCADE)
}}}

Resultant migration operations generated by `./manage.py makemigrations`:
{{{#!python
    operations = [
        migrations.CreateModel(
            name='Foo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ],
        ),
        migrations.CreateModel(
            name='Zzz',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ],
        ),
        migrations.AddField(
            model_name='foo',
            name='fk',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='testapp.Zzz'),
        ),
    ]
}}}

However if the `Zzz` model was instead called `Aaa`, then the migration file is correctly optimised (ie: the `ForeignKey` is defined within the `CreateModel` operation):
{{{#!python
    operations = [
        migrations.CreateModel(
            name='Aaa',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ],
        ),
        migrations.CreateModel(
            name='Foo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('fk', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='testapp.Aaa')),
            ],
        ),
    ]
}}}

Ideally the optimizer would either just use the order as defined in models.py (which would at least allow for users to order them sensibly), or else intelligently sort the models such that those with no (or fewer) foreign keys are listed in `operations` first, thereby reducing the number of cases where the FK has to be added in a separate `AddField` operation."	Bug	new	Migrations	dev	Normal				Unreviewed	0	0	0	0	0	0
