Django 管理员删除 != Model.delete()

Django admin delete != Model.delete()

在我们的代码库中,T 是一个 Model,对模型 P(具有 on_delete=CASCADE)具有外键依赖性,具有多对- 模型 C 上的许多字段,依此类推。

我的支持任务是删除所有 Tp__name(p 是对 P 的外键引用)属于一组 500+ 个值。

我尝试了两种方法:
1. 登录 django 管理门户并从那里删除 T 的单个实例。
2.我也试过做下面的t = T.objects.get(p__name="..some-name.."); t.delete()

方法 #1 似乎清除了所有链接。其中方法 #2 无法删除 t.p 指向的模型。这两种方法都命中了 Model.delete() 方法,我已经验证了这一点。然而,#1 比#2 更有效。但是,#1 是手动的,#2 是程序化的(因此是可取的)。

我正在寻找一种可以从管理站点复制删除操作的编程方法。

解决方案 - 删除 Ts 的编程方式原来是删除 Ps。我接受了 Alasdair 的回答。我仍然没有找到#1 和#2 不等价背后的原因。改天再说。

我认为您误解了级联的工作原理。如果我正确理解你的问题,你的模型是这样的:

class P(models.Model):
    pass

class T(models.Model):
    # on_delete=models.CASCADE is the default, including it here to be explicit
    p = models.ForeignKey(P, on_delete=models.CASCADE) 

删除 t 不会导致删除相关的 p。 CASCADE 意味着如果你删除一个 p,那么 link 到 p 的所有 t 都将被删除。

p = P.objects.get(name="x")
p.delete() # all t's that link to p will be deleted.

无论您使用 Django 管理还是以编程方式执行,都是这种情况。