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)
这样也能解决问题。