gpt4 book ai didi

django - 覆盖 Django 的级联删除行为的选项是什么?

转载 作者:行者123 更新时间:2023-11-28 19:33:49 27 4
gpt4 key购买 nike

Django 模型通常可以相当充分地处理 ON DELETE CASCADE 行为(以一种适用于 native 不支持它的数据库的方式。)

但是,我正在努力寻找在不合适的情况下覆盖此行为的最佳方法,例如在以下情况下:

  • ON DELETE RESTRICT(即防止删除具有子记录的对象)

  • ON DELETE SET NULL(即不删除子记录,而是将其父键设置为 NULL 以打破关系)

  • 删除记录时更新其他相关数据(例如删除上传的图像文件)

以下是我所知道的实现这些目标的潜在方法:

  • 覆盖模型的 delete() 方法。虽然这种方法有效,但当通过 QuerySet 删除记录时,它会被回避。此外,必须重写每个模型的 delete() 以确保永远不会调用 Django 的代码并且不能调用 super() 因为它可能使用 QuerySet 删除子对象。

  • 使用信号。这似乎是理想的,因为它们在直接删除模型或通过 QuerySet 删除时被调用。但是,无法阻止子对象被删除,因此无法实现 ON CASCADE RESTRICT 或 SET NULL。

  • 使用可以正确处理此问题的数据库引擎(Django 在这种情况下会做什么?)

  • 等到 Django 支持它(然后忍受错误...)

似乎第一个选项是唯一可行的,但它很丑,把婴儿连同洗澡水一起扔掉,并且在添加新模型/关系时可能会遗漏一些东西。

我错过了什么吗?有什么建议吗?

最佳答案

请注意也遇到此问题的人,Django 1.3 中现在有一个内置解决方案。

请参阅文档中的详细信息 django.db.models.ForeignKey.on_delete感谢 Fragments of Code 网站的编辑指出。

最简单的可能场景就是在你的模型 FK 字段定义中添加:

on_delete=models.SET_NULL

关于django - 覆盖 Django 的级联删除行为的选项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com