我在我的django管理员中使用了一个软删除,就像this一样。 问题是,当我删除一个外键项时,它似乎没有触发它链接到的所有项的删除。或者它确实如此,但它没有运行我的模型上的自定义 def delete 。
- 如果我删除某人,则会将其删除,但相关帐户不会受到影响。
- 如果我删除了软删除,那么当我删除一个人时,帐户也会被删除,这是正确的。
理想情况下,当我删除一个Person时,我希望它软删除引用Person的Person和Accounts也被软删除(将它们标记为无效)。
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删除时级联删除工作,但当我覆盖删除时,级联不会触发。
答案 0 :(得分:2)
您的Person
型号目前不适用于“软”删除。删除Person
对象时,Django将删除所有相关的Account
对象。如果要软删除Person
个对象,请在Person
模型中为其添加标记。然后,您需要确保默认的Account
经理排除那些与软删除的Person对象相关的帐户。
修改强>
一种方法是让默认管理器排除与非活动Person对象相关的对象,而不是将它们设置为“已删除”:
class AccountManager(models.Manager):
def get_query_set(self):
return self.filter(person__active=True).filter(active=True)
另一种方法是在软对象被软删除时将相关的帐户对象设置为“已删除”。为此,您可以使用信号。我认为Person对象上的post-save signal是合适的。
答案 1 :(得分:0)
另一种解决方案是使用django-softdelete,这是最近出现在github上的Django包:https://github.com/scoursen/django-softdelete
如果您为模型使用提供的SoftDeleteObject mixin,删除它们将自动导致所有相关模型的软删除。更好的是它存储了与软删除相关的所有模型,因此您也可以通过一次取消删除调用取消删除所有模型。