django.db.utils.IntegrityError:“ id”列中的空值违反了非空约束

时间:2019-11-20 03:15:42

标签: python django psql

我想使用以下方法将数据从Django模型保存到PostgreSQL数据库中:

mymodel.objects.create(title='test')

此模型仅具有标题和ID,但会引发此错误:

  

django.db.utils.IntegrityError:“ id”列中的空值违反了非空约束

我该如何解决?为什么没有自动设置id?

2 个答案:

答案 0 :(得分:1)

您应该允许Django创建id作为主键,而不是将其显式地放入模型中。如果需要将其作为单独的字段,则可以使用其他名称,例如mymodel_id。

示例:

class Book(models.Model):
    title = models.CharField(null=False, blank=False)

def __str__(self):
    return str(self.id)

运行之后:

python manage.py makemigrations
python manage.py migrate

如果您需要将Django与现有数据库集成,可以尝试以下操作:Integrating Django with an existing database

答案 1 :(得分:1)

如果您以某种方式在数据库级别更改了ID归档,并且想要再次使其成为自动递增序列,请执行

在下面的示例中,检查名为mytable的示例下面的示例中Postgres中的mymodel的表

Pick a starting value for the serial, greater than any existing value in the table
SELECT MAX(id)+1 FROM mytable

Create a sequence for the serial (tablename_columnname_seq is a good name)
CREATE SEQUENCE test_id_seq MINVALUE 3 (assuming you want to start at 3)

Alter the default of the column to use the sequence
ALTER TABLE test ALTER id SET DEFAULT nextval('test_id_seq')

Alter the sequence to be owned by the table/column;
ALTER SEQUENCE test_id_seq OWNED BY test.id

REF:Changing primary key int type to serial