【问题标题】:django model AutoField errordjango模型AutoField错误
【发布时间】:2016-02-01 22:04:24
【问题描述】:

我有一个这样的模型

class Alrule(models.Model):
    priority = models.PositiveIntegerField(unique=True)
    rule = models.CharField(max_length=256)

我迁移了这个模型。在我决定使用 AutoField 将优先级字段作为主键之后

然后我的模型看起来像这样:

class Alrule(models.Model):
    priority = models.AutoField(primary_key=True)
    rule = models.CharField(max_length=256)

我进行了迁移并迁移了此更改。

现在我再次需要恢复。现在我做了以下更改:

class Alrule(models.Model):
    priority = models.PositiveIntegerField(unique=True)
    rule = models.CharField(max_length=256)

我进行了迁移。 现在,当我迁移时,我收到以下错误:

AssertionError: A model can't have more than one AutoField.

我的理解是优先字段之前设置为 AutoField 并且没有被删除。请帮忙

我的第一次迁移如下所示:

operations = [
    migrations.RemoveField(
        model_name='alrule',
        name='id',
    ),
    migrations.AlterField(
        model_name='alrule',
        name='priority',
        field=models.AutoField(serialize=False, primary_key=True),
    ),
]

第二次迁移如下所示:

operations = [
    migrations.AddField(
        model_name='alrule',
        name='id',
        field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'),
        preserve_default=False,
    ),
    migrations.AlterField(
        model_name='alrule',
        name='priority',
        field=models.PositiveIntegerField(unique=True),
    ),
]

【问题讨论】:

  • 您能发布为这两个步骤生成的 hte 迁移吗?
  • @solarissmoke 我已经发布了生成的迁移

标签: django python-2.7 django-models


【解决方案1】:

如果你使用mssql-django,有一些限制:

目前不支持以下功能:

mssql-django 不支持基于 SQL 的正则表达式命令

在迁移时从 AutoField 更改模型字段或更改为 AutoField

https://github.com/microsoft/mssql-django#limitations

【讨论】:

    【解决方案2】:
    operations = [
        migrations.AddField(
            model_name='alrule',
            name='id',
            field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
        migrations.AlterField(
            model_name='alrule',
            name='priority',
            field=models.PositiveIntegerField(unique=True),
        ),
    ]
    

    您的表格已经有 AutoField,并且您正在添加另一个。

    为避免这种情况,只需像这样在迁移中交换您的操作:

    operations = [
        migrations.AlterField(
            model_name='alrule',
            name='priority',
            field=models.PositiveIntegerField(unique=True),
        ),
        migrations.AddField(
            model_name='alrule',
            name='id',
            field=models.AutoField(auto_created=True, primary_key=True, default=2, serialize=False, verbose_name='ID'),
            preserve_default=False,
        ),
    ]
    

    即首先更改字段(从表中删除 AutoField),然后完成 - 添加您的 id AutoField。

    【讨论】:

      【解决方案3】:

      是的,我得到了问题的简单破解。是这样的

      像这样进行最后的更改:

      class Alrule(models.Model):
          prioriti = models.PositiveIntegerField(unique=True)
          rule = models.CharField(max_length=256)
      

      这里应该为优先级字段赋予新名称('prioriti'),以便完全删除前一个字段并创建一个新字段。

      现在进行并应用迁移。

      现在再次将“prioriti”字段重命名为“priority”。并进行和应用迁移。

      我们已经完成了。

      【讨论】:

        【解决方案4】:

        这是因为 AutoField 并没有像您正确指出的那样被删除。删除这两个迁移文件并再次运行 makemigrations。如果它不起作用,您可能还必须在此之前删除迁移文件并再次运行迁移。

        作为最后的手段,您可以只删除 init.py 文件之外的迁移文件。但是,我确信一旦您删除这两个迁移并从那里进行新的迁移,它应该可以工作。

        【讨论】:

          猜你喜欢
          • 2015-02-17
          • 1970-01-01
          • 2015-10-14
          • 2019-06-10
          • 2017-09-14
          • 2021-01-06
          • 2012-03-10
          • 1970-01-01
          • 2018-03-05
          相关资源
          最近更新 更多