Ненужные автоматические миграции на Django?

запускаем python 3.6 и Django 3.1.7!

Итак, у меня есть проект Django с приложением, модели которого выглядят следующим образом:

class Department(models.Model_:
   name = models.CharField(max_length=255)

class Person(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    department = models.ForeignKey(
        Department, related_name="department_members", on_delete=models.CASCADE
    )

Когда я запускаю makemigrations я получаю следующее на 0001_initial.py:

class Migration(migrations.Migration):

    initial = True

    operations = [
        migrations.CreateModel(
            name='Person',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('first_name', models.CharField(max_length=255)),
                ('last_name', models.CharField(max_length=255)),
            ],
        ),
        migrations.CreateModel(
            name='Department',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=255)),
            ],
        ),
        migrations.AddField(
            model_name='person',
            name='department',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='department_members', to='my_app.department'),
        ),
    ]

Все это хорошо и прекрасно, но теперь я получаю этот красный текст:

Your models have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Когда я запускаю makemigrations снова, я получаю следующее 0002_auto_20211111_1116.py:

class Migration(migrations.Migration):

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

    operations = [
        migrations.AlterField(
            model_name='Department',
            name='id',
            field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
        ),
        migrations.AlterField(
            model_name='Person',
            name='id',
            field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
        ),
    ]

Я не вносил изменений в models.py, а также не вижу разницы в поле 'id', которое изменяется при автоматической миграции.

Я всегда могу оставить 0002 в папке и жить дальше, но это действительно беспокоит меня. Что дает Django сигнал, что что-то было изменено в моих моделях? Как избежать необходимости создавать вторую миграцию?

Спасибо!

Переносит первичные ключи с BigAutoFields на AutoFields. Вероятно, причина этого в том, что начиная с версии в настройки добавлена настройка DEFAULT_AUTO_FIELD [Django-doc]. Если вы таким образом указали для этой настройки:

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

Тогда Django будет использовать BigAutoField.

Если вы затем мигрировали обратно на , то Django не принял во внимание настройку DEFAULT_AUTO_FIELD и будет использовать AutoField. Поскольку вы не упоминаете первичный ключ явно, это означает, что он предполагает, что вы используете AutoField, и, таким образом, перенесет поля в AutoField.

Если вы не хотите этого, вы можете удалить файл миграции и явно определить поля id с помощью:

class Department(models.Model):
    id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
   name = models.CharField(max_length=255)

class Person(models.Model):
    id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    department = models.ForeignKey(
        Department, related_name="department_members", on_delete=models.CASCADE
    )
Вернуться на верх