1

我需要自定义 aModel.delete()以便它不执行任何级联删除,而是在有任何引用该实例的对象时引发异常。似乎默认实现不允许跳过相关对象的删除:

def delete(self, using=None, keep_parents=False):
    using = using or router.db_for_write(self.__class__, instance=self)
    assert self.pk is not None, (
        "%s object can't be deleted because its %s attribute is set to None." %
        (self._meta.object_name, self._meta.pk.attname)
    )

    collector = Collector(using=using)
    collector.collect([self], keep_parents=keep_parents)
    return collector.delete()

如何确保 Django 不会级联删除任何相关对象?

4

1 回答 1

2

与您的模型一起使用:

modelName = models.ForeignKey(Post, on_delete=models.PROTECT, related_name='things')

另外,请注意您有六种类型的操作是:

  • CASCADE:当被引用的对象被删除时,也会删除引用它的对象(例如,当您删除博客文章时,您可能还想删除评论)。SQL 等效项:CASCADE。

  • PROTECT:禁止删除引用的对象。要删除它,您必须手动删除所有引用它的对象。SQL 等效项:RESTRICT。

  • SET_NULL:将引用设置为 NULL(要求该字段可以为空)。例如,当您删除用户时,您可能希望保留他在博客文章中发布的评论,但说它是由匿名(或已删除)用户发布的。SQL 等效项:SET NULL。

  • SET_DEFAULT:设置默认值。SQL 等效项:SET DEFAULT。

  • SET(...) : 设置给定值。这不是 SQL 标准的一部分,完全由 Django 处理。

  • DO_NOTHING:可能是一个非常糟糕的主意,因为这会在您的数据库中产生完整性问题(引用实际上不存在的对象)。SQL 等效项:无操作。

来源:Django 文档

于 2019-07-24T15:06:59.247 回答