如何检查Django中哪些对象将被级联删除?

时间:2014-11-07 18:36:43

标签: django django-admin

在Django的/ admin /部分,您可以选择删除项目。

如果任何相关对象与您选择的对象一起被删除,您可以在确认删除之前查看受影响对象的列表。

我可以通过编程方式在我自己的函数中检查这个吗?

我想做点什么

for item in Item.objects.all():
    if not deletion_would_also_delete_other_objects(item):
        item.delete()

2 个答案:

答案 0 :(得分:19)

您可以使用django.db.models.deletion导入收集器来执行此操作吗?

from django.db.models.deletion import Collector
from .models import Item

for item in Item.objects.all(): 
    collector = Collector({})
    collector.collect([item])

    # dependencies should be an empty dict if the item is not related to anything
    if not collector.dependencies:
        item.delete()

答案 1 :(得分:4)

我建议使用 django admin 中提供的 NestedObjects 实用程序。

from django.contrib.admin.utils import NestedObjects
from django.db import router

using = router.db_for_write(Item._meta.model)
# if you only have one database, just set using = "default"

nested_object = NestedObjects(using)
nested_object.collect([Item])
# If you want to delete multi item, you can use:
# nested_object.collect(Model.objects.filter(type="deleted"))

print(nested_object.nested()

结果如下: example result