django软删除不级联删除

我在我的
django管理员中使用了一个软删除,就像
this一样.

问题是,当我删除一个外键项时,它似乎没有触发它链接到的所有项的删除.或许它确实如此,但它没有运行我的模型上的自定义def删除.

– 如果我删除了一个人,那么他们会被软删除,但相关的帐户保持不变.

– 如果我删除软删除,那么当我删除一个人时,帐户也会被删除,这是正确的.

所以理想情况下,当我删除一个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删除时级联删除工作,但当我覆盖删除时,级联不会触发.

最佳答案 您的Person模型目前不是为“软”删除而设计的.当您删除Person对象时,Django将删除所有相关的Account对象.如果要软删除Person对象,请在Person模型中为其添加标志.然后,您需要确保您的默认客户经理排除那些与软删除的Person对象相关的帐户.

编辑:

>一种方法是使默认管理器排除与非活动Person对象相关的对象,而不是将它们设置为“已删除”:

  class AccountManager(models.Manager): 
      def get_query_set(self):
          return self.filter(person__active=True).filter(active=True)

>另一种方法是在软对象被软删除时将相关的帐户对象设置为“已删除”.为此,您可以使用信号.我认为在Person对象上有一个post-save signal是合适的.

点赞