微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 中有条件“ON DELETE CASCADE”这样的东西吗?

如何解决Django 中有条件“ON DELETE CASCADE”这样的东西吗?

是否有一种简单的方法,使用 on_delete,在删除 ForeignKey 时删除包含 ForeignKey 的对象(如 models.CASCADE 通常会这样做),但只删除None 的 ForeignKey 关系如果满足某些条件(如 models.SET_NULL 通常会这样做)。

这是一些代码

class SomeThing(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,related_name="things",on_delete=models.CONDITIONAL_CASCADE,# obvIoUsly this is wrong
    )
    is_private = models.BooleanField(default=False)
>>> user = User(username="bob").save()
>>> public_thing = SomeThing(is_private=False)
>>> private_thing = SomeThing(is_private=True)
>>> user.things.add(public_thing)
>>> user.things.add(private_thing)
>>> user.delete()

user删除时,我希望 private_thinguser 一起被删除,但 public_thing 删除并且对于public_thing.user 设置为 None

谢谢。


编辑:

感谢@Jarad 的建议,我最终编写了以下通用函数


def CONDITIONAL_CASCADE(collector,field,sub_objs,using,**kwargs):
    
    condition = kwargs.get("condition",{})
    default_value = kwargs.get("default_value",None)

    sub_objs_to_cascade = sub_objs.filter(**condition)
    sub_objs_to_set = sub_objs.exclude(**condition)

    models.CASCADE(collector,sub_objs_to_cascade,using)
    collector.add_field_update(field,default_value,sub_objs_to_set)

并像这样使用它:

CASCADE_PRIVATE_THINGS_ONLY = partial(
    CONDITIONAL_CASCADE,condition={"is_private": True},default_value=None
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。