2015-11-02 79 views
2

我有过这样Django的模型下拉列表AutoField错误

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

你可以发布为两个步骤生成的hte迁移吗? – solarissmoke

+0

@solarissmoke我已经发布了生成的迁移 – wrufesh

回答

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。

0

这是因为下拉列表AutoField并没有被删除,就像你正确显示。删除这两个迁移文件并再次运行makemigrations。如果不起作用,则可能还必须先删除迁移文件,然后再次运行迁移。

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

0

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

作出这样的最终变化:

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

以下优先领域应该被赋予新的名称(“prioriti”),这样previos一个被完全删除,并创建一个新的领域。

现在制作并应用迁移。

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

我们完成了。