问题描述
是否有一种简单的方法,使用 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 (将#修改为@)