【问题标题】:Django delete an object without cascading to ManyToMany relationshipsDjango 删除对象而不级联到多对多关系
【发布时间】:2014-04-26 05:52:59
【问题描述】:

情况如下:

class Party(models.Model):
    hosts = ManyToManyField("User")

现在假设我有一个聚会p。我想删除p(即通过p.delete())而不删除其所有主机。我该怎么做呢?如果我将选项on_delete 添加到主机,django 无法识别它。

【问题讨论】:

  • 如果你删除p,它的hosts不会被删除。

标签: python sql database django


【解决方案1】:

级联删除功能适用于 ForeignKey 关系,因为持有 ForeignKey 的模型可能具有依赖于关系的状态和行为。为了避免在这种情况下级联删除,对于某些对象 foo,您必须遍历 foo 的所有相关对象,确保所有对象都具有

null=True

对于 foo,那么你必须设置

foo=None

对于每一个这样的相关对象,然后你可以调用

foo.delete()

不删除 foo 的相关对象。

但这些都不适用于您的情况,因为您有一个 ManyToMany 字段。级联删除对于多对多关系没有意义,因为没有一个对象与另一个对象紧密耦合,就像 ForeignKey 一样。

【讨论】:

  • 嗯,但是p.delete() 也会删除多对多关系中的所有用户。顺便说一句,我已经“解决”了这个问题,只需从关系中删除所有用户并从所有相关用户的party_sets 中删除派对。即使在这样做之后,并执行p.delete(),所有用户都被删除......所以我只是取消关系并将派对保留在数据库中而不是删除派对。
  • 你不应该这样做。根据 Django 文档,“当 Django 删除一个对象时,默认情况下它会模拟 SQL 约束 ON DELETE CASCADE 的行为——换句话说,任何具有指向要删除对象的外键的对象都将与它一起被删除。”
  • @wbr OneToOne 关系怎么样,Django 对它们应用级联删除吗?
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多