在django中检索要在级联中删除的对象[重复]

Posted

技术标签:

【中文标题】在django中检索要在级联中删除的对象[重复]【英文标题】:Retrieve objects about to be deleted in cascade in django [duplicate] 【发布时间】:2016-06-15 07:48:28 【问题描述】:

考虑这些类:

class Foo(models.Model):
    pass

class Bar(models.Model):
    foo = models.ForeignKey(Foo)

class Baz(models.Model):
    bar = models.ForeignKey(Bar)

class XXX(models.Model):
    field = models.ForeignKey(field_related_to_FOO_somehow)
...

给定一个用户想要删除的实例foo=Foo.objects.get(...),我想向他提供他将要删除的所有对象的视图。因此,如果用户确认,我如何检索BarBaz 和所有其他相关对象XXX 的所有实例将被级联删除?

【问题讨论】:

你能使用和 django admin 一样的功能吗? github.com/django/django/blob/1.9.7/django/contrib/admin/… 这里有一个类似的问题:***.com/questions/12158714/… 【参考方案1】:
foo = Foo.objects.get(id=foo_id)

bar = Bar.objects.filter(foo=foo)

baz = Baz.objects.filter(bar=bar)

baz.delete()
bar.delete()

或者只是

foo.delete()

【讨论】:

我不想删除东西,但知道要删除什么。我不想明确声明相关对象,但想要通用并递归检索所有相关对象 你只是删除 foo - 在你运行 foo.delete() 的那一刻,所有的孩子都会消失 这仍然行不通,因为我正在考虑删除前的那一刻。【参考方案2】:

您可以使用on_delete=models.SET_NULL 这将在删除相关对象时设置为 None。

docs.djangoproject.com/en/1.9/ref/models/fields/#foreignkey

【讨论】:

以上是关于在django中检索要在级联中删除的对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在级联中设置 UIPickerView

如何使用 ajax 在 Django-admin 表格内联中读取/写入输入字段?

在Django .delete()中,是否可以检索被删除对象的'id'字段?

当添加权限为 False 时,Django-grappelli 添加按钮在内联中可见

如何防止在级联运算符中创建中间对象?

Django视图绕过渲染请求