【问题标题】:Unnecessary auto migrations on Django?Django上不必要的自动迁移?
【发布时间】:2021-12-23 21:56:31
【问题描述】:

运行 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 我的模型发生了变化的信号?如何避免创建第二次迁移?

谢谢!

【问题讨论】:

  • 中间有没有升级 Django 版本?
  • 该死的,准点!不得不从 3.2 降级到 3.1,因为 Silk 与 3.2 不兼容

标签: python django django-models django-migrations


【解决方案1】:

它将主键从BigAutoFields 迁移到AutoFields。可能的原因是因为DEFAULT_AUTO_FIELD setting [Django-doc] 被添加到设置中。如果您因此指定了该设置:

<strong>DEFAULT_AUTO_FIELD</strong> = '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
    )

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2019-06-17
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多