您的位置:

最佳方案处理django ValueError("Model %s can't have more than one auto-generated field."% cls._meta.label)

  发布时间:2023-04-02 17:16:41
报错的原因这个错误出现是因为你在Django数据模型中定义了多于一个自动生成的字段。在Django模型中,只能有一个字段被标记为标记的字段通常是自动生成的,例如自动增量的主键字段。最后再运行数据迁移操作来修改数据库结构以适应新的模型。

报错的原因

这个错误出现是因为你在Django数据模型中定义了多于一个自动生成的字段。

在Django模型中,只能有一个字段被标记为 auto_created=True, auto_created 标记的字段通常是自动生成的,例如自动增量的主键字段。

为了解决这个错误,您需要确保模型中只有一个字段被标记为 auto_created=True。

检查你的model类,如果有多个字段被标记了auto_created=True, 那么将需要更改其中一个字段auto_created = False。

如何解决

要解决这个问题,您需要编辑你的模型,确保只有一个字段被标记为auto_created=True.

例如, 如果你有一个模型类MyModel, 它有两个字段auto_created_field1和auto_created_field2,这两个字段都被标记为auto_created=True,那么你需要选择一个字段并将其 auto_created 标记设置为 False.


class MyModel(models.Model):
    auto_created_field1 = models.AutoField(primary_key=True, auto_created=True)
    auto_created_field2 = models.AutoField(auto_created=True)
    # here you should remove one of the auto_created=True flag.

如果你不确定哪个字段是不需要的, 那就需要先检查数据和数据表结构,再决定哪个字段是多余的。

最后再运行数据迁移操作来修改数据库结构以适应新的模型。

使用例子

是的,这是一个示例模型类:


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    auto_created_field = models.AutoField(auto_created=True)  #这里就是错误的地方,因为已经有一个自增的id了,不需要再设置一个自增的字段

在这个例子中,MyModel类中有两个自增字段 'id' 和 'auto_created_field', 这就会导致 "ValueError: Model %s can't have more than one auto-generated field."

可以看到,错误是由于第二个自增字段 'auto_created_field' 导致的,需要将其auto_created=False, 或者删除


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    auto_created_field = models.AutoField(auto_created=False) 

这样就不会再有这个错误了

另外需要注意的是, django在设计模型时,会自动生成一个主键字段,如果你不想使用它自动生成的字段, 你可以自己定义一个自己的主键,而不是使用自动生成的字段, 但是需要注意的是,这个自定义的字段需要是唯一的,并且不能为空,所以要设置为primary_key=True, unique=True, blank=False, null=False 。

这样就能避免上述错误


class MyModel(models.Model):
    custom_primary_key = models.CharField(primary_key=True, max_length=50, unique=True, blank=False, null=False)

如果确定要使用自动生成的主键,那么可以考虑在自己定义的字段中去掉auto_created=True 或者删除多余字段。