django soft delete不会级联删除 [英] django soft delete doesn't cascade delete
问题描述
我在django管理员中使用了一个软删除,像这个。
问题是当我删除一个外键项时,它似乎没有触发所有链接到的项目的删除。或者也可以这样做,但它没有运行我的模型上的自定义 def delete 。
I'm using a soft delete in my django admin, done like this. The issue is that when I delete a foreign key item, that it doesn't seem to trigger the deletes for all the items it's linked to. Or maybe it does but it's not running the custom def delete I have on my model.
- 如果我删除一个人,那么他们是软的 - 已删除,但相关帐户保持不变。
-If I delete a person then they are soft-deleted, but the related account is left untouched.
- 如果我删除软删除,那么当我删除一个人时,帐户也被删除,这是正确的。
-If I remove the soft deletes, then when I delete a Person, the Accounts are deleted too which is correct.
所以理想情况下,当我删除一个人时,我想要它软删除Person和引用Person的帐户也被软删除(标记为不活动)
class Person(models.Model):
description = models.CharField(max_length=100)
def delete(self, *args, **kwargs):
self.active = False
self.deleted_date = datetime.now()
self.save()
class Account(models.Model):
name = models.CharField(max_length=50)
person = models.ForeignKey(Person, null=True, blank=True)
active = models.BooleanField(default=True, editable=False)
objects = SoftDeleteManager()
def delete(self, *args, **kwargs):
self.active = False
self.deleted_date = datetime.now()
self.save()
def __unicode__(self):
return "%s: %s" % (self.type,self.name)
更新: 。我没有说我在Person模型上运行软删除。还补充说,当def删除不被覆盖时,级联删除工作,但是当我覆盖删除时,级联不会触发。
UPDATE: I have updated the question. I had not said that I'm running a soft delete on the Person model. Also added that when the def deletes are not overridden that the cascading deletes work, but when I do override the delete, the cascading doesn't trigger.
推荐答案
您的人员
模型目前不适用于软删除。当您删除 Person
对象时,Django将删除所有相关的帐户
对象。如果要软件删除 Person
对象,请在 Person
模型中添加一个标志。然后,您需要确保您的默认帐户
管理员不包括与软删除的Person对象相关的帐户。
Your Person
model is not currently designed for "soft" deletes. When you delete a Person
object, Django will remove all related Account
objects. If you want to soft-delete Person
objects, add a flag for that in the Person
model. Then you need to make sure that your default Account
manager excludes those accounts that are related to a soft-deleted Person object.
编辑
-
一种方法是使默认管理器排除与非活动相关的对象人物对象而不是设置它们删除:
One approach is making the default manager exclude the objects related to inactive Person objects instead of setting them "deleted":
class AccountManager(models.Manager):
def get_query_set(self):
return self.filter(person__active=True).filter(active=True)
另一种方法是将Person对象软删除时,将相关的Account对象设置为已删除。为此,您可以使用信号。 后保存信号 on个人对象是合适的我认为。
Another approach would be setting your related Account objects "deleted" when a Person object is soft-deleted. For that, you could use a signal. A post-save signal on Person objects would be appropriate I think.
这篇关于django soft delete不会级联删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!