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

Boh*_*ohr 14 django django-admin

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

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

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

我想做点什么

for item in Item.objects.all():
    if not deletion_would_also_delete_other_objects(item):
        item.delete()
Run Code Online (Sandbox Code Playgroud)

Tar*_*req 20

您可以使用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()
Run Code Online (Sandbox Code Playgroud)

  • 我得到`TypeError:hasattr():属性名必须是Django 1.9中`collector.collect([item])`的字符串.如果我在实例化收集器时指定`using`参数,那么这是固定的:`collector = Collector(using ='default')`. (13认同)
  • 我不确定这是否准确(至少现在是这样)。我发现`.dependencies` 是空的,但是`.data` 和`.fast_deletes` 都显示了很多将被删除的对象。 (3认同)

ram*_*win 12

我建议使用NestedObjectsdjango admin 中提供的 util。

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()
Run Code Online (Sandbox Code Playgroud)

结果如下: 结果示例