Django 管理员删除 != Model.delete()
Django admin delete != Model.delete()
在我们的代码库中,T
是一个 Model
,对模型 P
(具有 on_delete=CASCADE
)具有外键依赖性,具有多对- 模型 C
上的许多字段,依此类推。
我的支持任务是删除所有 T
的 p__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 是程序化的(因此是可取的)。
我正在寻找一种可以从管理站点复制删除操作的编程方法。
解决方案 - 删除 T
s 的编程方式原来是删除 P
s。我接受了 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 管理还是以编程方式执行,都是这种情况。
在我们的代码库中,T
是一个 Model
,对模型 P
(具有 on_delete=CASCADE
)具有外键依赖性,具有多对- 模型 C
上的许多字段,依此类推。
我的支持任务是删除所有 T
的 p__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 是程序化的(因此是可取的)。
我正在寻找一种可以从管理站点复制删除操作的编程方法。
解决方案 - 删除 T
s 的编程方式原来是删除 P
s。我接受了 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 管理还是以编程方式执行,都是这种情况。