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 关系。
现在这可能是好是坏取决于您打算如何使用它:
上帝:
- 您仅通过子处理 Child 和 Parent 数据,而无需您对哪些数据保存到父模型中进行微观管理,并且哪些数据被保存到子模型中(特别是如果您使用 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...
我有一个包含很多字段的 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 关系。
现在这可能是好是坏取决于您打算如何使用它:
上帝:
- 您仅通过子处理 Child 和 Parent 数据,而无需您对哪些数据保存到父模型中进行微观管理,并且哪些数据被保存到子模型中(特别是如果您使用 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...