当前位置: 首页 > 知识库问答 >
问题:

是否可以在Django中执行条件ForeignKey.on_delete?

罗学林
2023-03-14

通过on_delete选项,Django提供了各种方法来处理具有被删除对象外键的对象。

我想知道是否有一种方法,我可以做类似的事情,但有条件的。下面是一个场景。我正在使用Django1.5新的自定义用户模型,我的所有用户都有一个网站的外键。像这样:

class TenantSiteUser(AbstractUser):
  site = models.ForeignKey(Site, null=True)

如果一个站点被删除了,那么我更愿意删除所有链接到该站点的非超级用户(即类似KASKADE的behavoir),因为它们的存在现在已经没有意义了。但如果是超级用户,我更愿意将用户的站点设置为null(即set_null),并让它们保持存在,因为这可能是我或我的同事,我们不想无意中删除自己。

有什么我可以重写的手动检查和实现这种类型的on_delete行为?

编辑:以下是最终对我有效的代码,基于@Kevin的回答和对现有处理程序如何工作的一些研究:

def NULLIFY_SUPERUSERS_ELSE_CASCADE(collector, field, sub_objs, using):
    superusers = []
    for user in sub_objs:
        if user.is_superuser:
            sub_objs = list(sub_objs)
            sub_objs.remove(user)
            superusers.append(user)

    CASCADE(collector, field, sub_objs, using)
    if len(superusers):
        collector.add_field_update(field, None, superusers)

class TenantSiteUser(AbstractUser):
    site = models.ForeignKey(Site, null=True, on_delete=NULLIFY_SUPERUSERS_ELSE_CASCADE)

共有1个答案

皇甫乐
2023-03-14

Django提供的选项(CASCADEPROTECT等)都是函数,下面是1.5版的定义。

我还没有测试过它,但应该可以编写自己的NULL\u或\u CASCADE函数,并将其作为字段的on\u delete参数传入。

 类似资料:
  • 问题内容: 我必须转换一个传递查询的MSSQL存储过程: 这不起作用。我敢肯定,而不是MySQL的命令,但也不管用。 有谁知道是否有可能为MySQL提供类似JavaScript的功能? 问题答案: EXECUTE是MySQL中的有效命令。MySQL参考手册

  • 问题内容: 我正在寻找一种在客户端(即在浏览器中)进行traceroute的方法。 据我所知,不可能通过Javascript或Flash发送具有任意TTL值的ICMP,UDP或TCP数据包。我知道Flash允许通过Actionscript中的Socket类进行TCP连接,但是它对于traceroute实现似乎没有用。 是开发浏览器插件的唯一解决方案吗? 编辑 :我刚刚发现它已经用Java小程序完成

  • 问题内容: 我想编写一个与此SQL查询等效的Django查询: 如何构造Django queryset过滤器? 这是行不通的,因为它是过滤器。我想要过滤器以获取单个查询集的并集。 问题答案: 通过文档

  • 是否有可能在函数的上下文中解析(实现)一个promise对象?是否有其他方法处理这个问题? UPD:这个代码对我有效。谢了!

  • 问题内容: 简而言之,我需要能够将已编译的可执行文件粘贴到Java jar文件中,然后能够从Java运行它(可能通过)。 的 原因 ,是我想使用Java来包裹ImageMagick的可执行文件成分的图像处理弹性的Map Reduce任务。EMR只希望获取一个jar文件,因此我认为没有空间在旋转的数据节点上安装软件。 问题答案: jar中的可执行文件是一种资源,您可以通过Stream访问它,并将可执

  • 这是我想做的代码,但什么也没有做。我甚至试过这个 但我找不到任何解决办法...有人能帮我吗?