【问题标题】:django orm delete object derived from another modeldjango orm 删除从另一个模型派生的对象
【发布时间】:2017-08-08 14:09:07
【问题描述】:

我有以下问题:

class A (models.Model):
   name = models.CharField(max_length=80, default="")

class B(A):
   another_name = models.CharField(max_length=80, default="")

如果 B 被删除,如何自动删除 A?如果我使用 foreign_key 和 DELETE_CASCADE 一切都很好,但使用派生模型则不行。

【问题讨论】:

  • 你如何确定A的哪个对象连接到B的哪个对象
  • 在B的数据库对象中有一个指向A对象的指针
  • 为什么不写一个自定义的删除方法。这将是一个非常简单的解决方案
  • 我在使用普通 SQL 删除条目时遇到问题。在表定义 (SQL) 中,缺少 DELETE CASCADE 约束。
  • 不要写普通的 SQL 使用 orm 来代替

标签: django django-models


【解决方案1】:

基本上可以为模型 B 编写自己的 delete() 方法来删​​除模型 A 的对象。 但是,如果没有 ForeignKey,您应该如何决定/知道哪个对象 A 必须与删除特定对象 B 进行级联?

【讨论】:

  • 使用 django 删除对象时,会删除基础对象。只是不在sql级别。 Django ORM 没有在数据库中设置 DELETE CASCADE。
  • 我不太明白。你说 - 如果我错了,请纠正我 - 如果使用 django 删除模型的对象,它不会从数据库中删除?还是您只是指继承模型上的 CASCADE 删除?
  • 我的意思是从数据库中删除了继承的模型。如果您使用 django(或管理员)删除它,则基础对象将被删除。如果您使用纯 SQL,则不会删除基础对象(在这种情况下为 A)。
  • 模型 A 的对象无论如何都没有链接到模型 B。当模型 B 消失时,为什么要删除它们中的任何一个?如果要链接它们,则它们之间必须有关系。然后关系是这两个模型的对象之间的关系,而不是“整个”模型 B 和单个模型 A 对象之间的关系。您已经用 ForeignKey 说过一切都很好 - 您使用外键的动机是什么?
  • B 派生自 A。如果您查看创建的表,您会看到
【解决方案2】:

当使用 dbshel​​l 并删除 B 对象时,一切都很好。 B 类的基础对象也被删除(在这种情况下为 A)。

Django 不会将 DELETE CASCADE 放在数据库级别。如果使用 sql 删除模型 B 对象,A 对象仍保留在 db 中。

真可怜

【讨论】:

    【解决方案3】:

    给 MaxM 的信息。我想要以下数据库约束。 Django 不会创建这个

    ALTER TABLE B
        ADD CONSTRAINT B_A_fkey FOREIGN KEY (A_ptr_id)
            REFERENCES A (id)
            ON UPDATE CASCADE ON DELETE CASCADE;
    

    它只模拟这种行为。你的建议只允许我控制A_ptr_id的名字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2018-02-23
      • 2011-07-01
      • 1970-01-01
      相关资源
      最近更新 更多