【问题标题】:Django subclass model gives "duplicate key value violates unique constraint" on saveDjango 子类模型在保存时给出“重复键值违反唯一约束”
【发布时间】:2021-05-03 23:38:02
【问题描述】:

我有一个包含许多字段的课程:

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

我创建了一个子类

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.

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

【问题讨论】:

  • 似乎您正在调用已存在父级的子级保存...因此您收到唯一约束违规错误?仅当父级不存在或仅更新父级或将其保留在数据库中时,您可能必须覆盖子级的保存方法以保存父级...

标签: django django-models primary-key


【解决方案1】:

我可以通过从父模型中删除 id 来解决这个问题。 我认为问题在于孩子的 id 从 0 开始,这违反了父母 pk 的唯一性。 使用 Django 内置的主键系统是可行的。

【讨论】:

    【解决方案2】:

    使用SubClass,通常称为“表继承”,它在子级和父级之间创建了 OneToOne 关系。

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

    上帝:

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

    不好:

    • OneToOne relationship 它在唯一约束下。

    这意味着您一次只能有 一个 Parent一个 Child 关联。例如:Parent(with ID 13)Child(with the ID 25) 之间的 OneToOne 关系必须是唯一的,并且没有其他 Child 可以与 Parent(with ID 13) 有另一个 OneToOne 关系

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

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

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

    或者您可能已经知道这一点,实际上……不知何故,您的一个子实例没有足够快地转储/删除父关系,以至于它可以在之后被另一个子实例占用……

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 2016-06-12
      • 2016-11-27
      • 2018-03-14
      • 2012-12-31
      • 1970-01-01
      • 2011-06-26
      • 2016-01-24
      • 2012-06-20
      相关资源
      最近更新 更多