django模型AutoField错误

时间:2015-11-02 04:00:08

标签: django python-2.7 django-models

我有一个这样的模型

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),
    ),
]

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

是的,我得到了问题的简单黑客。就像这样

做出最终改变:

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

此处应为优先级字段指定新名称('prioriti'),以便完全删除previos,并创建新字段。

现在制作并应用迁移。

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

我们已经完成了。

答案 2 :(得分:0)

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 :(得分:0)

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

目前不支持以下功能:

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

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

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