Django 子类模型在保存时给出 "duplicate key value violates unique constraint"

Django subclass model gives "duplicate key value violates unique constraint" on save

我有一个包含很多字段的 class:

class Parent(models.Model):
    id = models.AutoField(primary_key=True)
    ... many more fields

我创建了一个子class

class Child(Parent):
    other_field = models.CharField(max_length=512, blank=True, null=True)
    date_featured = models.DateField()

在我迁移并在管理员中创建一个子对象后,我得到

duplicate key value violates unique constraint "parent_pkey"
DETAIL:  Key (id)=(5) already exists.

我看到一些类似的问题建议您修改数据库,但我不能轻易做到。我需要更改subclass的id吗?

我能够通过从 parent 模型中删除 id 来解决这个问题。 我认为问题是 child 的 id 从 0 开始,这违反了 parent 的 pk 的唯一性。 使用 Django 的内置主键系统有效。

使用通常称为 "Table 继承"SubClass 在其内部创建了子项和父项之间的 OneToOne 关系。

现在这可能是好是坏取决于您打算如何使用它:

上帝:

  • 您仅通过子处理 ChildParent 数据,而无需您对哪些数据保存到父模型中进行微观管理,并且哪些数据被保存到子模型中(特别是如果您使用 ModelForm 甚至 ModelSerializer)

差:

  • OneToOne relationship受唯一约束。

这意味着您只能将 one Parent 关联到 one Child一次。例如:Parent(with ID 13)Child(with the ID 25) 之间的 OneToOne 关系必须是唯一的,其他 Child 不能与 Parent(with ID 13)[= 有另一个 OneToOne 关系15=]

正如我所说,这是好还是坏...

A User 模型可以指定为 Profile(User) 的父模型,这隐含地确保了唯一性(没有用户拥有超过一个配置文件)并且您可以直接通过配置文件模型管理整个 CRUD。

但是如果您需要从 Parent class 继承以创建多个 Child class 实例...那么 ForeignKey 就是解决方案。 (一对多).

或者也许你已经知道了,事实上......你的一个 Child 实例不是 Dumping/removing Parent 关系足够快,以至于它可以被另一个 Child 实例 AFTER...