如何解决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_thing
与 user
一起被删除,但 public_thing
不 被删除并且对于public_thing.user
设置为 None
。
谢谢。
编辑:
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 举报,一经查实,本站将立刻删除。