您的位置:

django报错ValueError(f"Primary key '{pk_class_path}' referred by {source} must "f"subclass AutoField.")怎么办

  发布时间:2023-03-31 13:03:38
报错的原因这个错误消息表明你尝试使用一个非AutoField类型的字段作为Django模型的主键,而Django要求主键必须是AutoField类型。如何解决如果你确实想要指定一个非AutoField类型的字段作为主键,那么你需要在这个字段前面添加`primary_key=True`来指示Django这个字段是主键另外一种解决方案是使用Django的自动主键,即使用Django默认的AutoField作为主键,这样可以避免这个错误第二种方案更常用,因为这样可以让Django自动维护主键。

报错的原因

这个错误消息表明你尝试使用一个非AutoField类型的字段作为Django模型的主键(Primary Key),而Django要求主键必须是AutoField类型。

这可能是由于你在模型中指定了一个错误的字段作为主键,如果你想自己来设定主键,那么需要在字段前面加上Primary_key=True


class MyModel(models.Model):
    my_field = models.CharField(max_length=100, primary_key=True)

这样可以设置你自己定义的主键,如果你没有设置主键,Django会自动添加一个id, 作为主键,这个id是自动增长的主键。

如果你并不想自己指定,可以删除你指定的主键。

如何解决

如果你确实想要指定一个非AutoField类型的字段作为主键,那么你需要在这个字段前面添加`primary_key=True`来指示Django这个字段是主键。


class MyModel(models.Model):
    my_field = models.CharField(max_length=100, primary_key=True)

另外一种解决方案是使用Django的自动主键,即使用Django默认的AutoField作为主键,这样可以避免这个错误。


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    my_field = models.CharField(max_length=100)

第二种方案更常用,因为这样可以让Django自动维护主键。

使用例子

假设你有下面的模型,其中“my_field”字段被指定为主键,但它不是AutoField类型:


class MyModel(models.Model):
    my_field = models.CharField(max_length=100, primary_key=True)

这将导致上述错误。

要解决这个问题,可以更改模型如下:


class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    my_field = models.CharField(max_length=100)

在这种情况下,添加一个自动增长的整数类型的主键id, 这样就能避免上述错误了。

或者你可以在你所要指定的字段上加上 primary_key=True,但要确保这个字段是唯一的。


class MyModel(models.Model):
    my_field = models.CharField(max_length=100, primary_key=True,unique=True)

这样也能解决问题。