我在Django中有一个非托管模型:
class Person(models.Person):
name = models.CharField(max_length=200)
class Meta:
managed = False
db_table = '"public"."person"'
在我的测试中,我尝试在DB中创建一个Person条目:
person = Person(name="Ariel")
person.save()
但是我得到一个错误:
django.db.utils.IntegrityError: null value in column "id" of relation "person" violates not-null constraint
DETAIL: Failing row contains (null, Ariel).
在测试之外,一切正常。在测试中,我通过加载模式转储,用非托管对象引用的表初始化DB。
Django文档声明"不会对这个模型执行数据库表的创建、修改或删除操作",并且"模型处理的所有其他方面都与正常情况完全相同",包括"如果你没有声明它,就自动向模型添加一个主键字段"。但这不意味着这段代码应该可以工作吗?为什么Django和Postgres不关心id?我做错了什么吗?我该怎么修理它?
当然,你的问题是,在你的PostgreSQL表中,id
不是一个自动增量字段,默认为空。
在Django上使用非托管模型时,这是一个很常见的问题。你需要覆盖你正在使用的表的每一个方面。