Ненужные автоматические миграции на 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 сигнал, что что-то было изменено в моих моделях? Как избежать необходимости создавать вторую миграцию?
Спасибо!
Переносит первичные ключи с BigAutoField
s на AutoField
s. Вероятно, причина этого в том, что начиная с версии django-3.2 в настройки добавлена настройка DEFAULT_AUTO_FIELD
[Django-doc]. Если вы таким образом указали для этой настройки:
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
Тогда Django будет использовать BigAutoField
.
Если вы затем мигрировали обратно на django-3.1, то 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
)