django 软删除不会级联删除

dar*_*ren 5 django django-admin django-managers

我在我的 django 管理员中使用了软删除,就像这样。问题是,当我删除一个外键项目时,它似乎没有触发对其链接到的所有项目的删除。或者可能确实如此,但它没有运行我的模型上的自定义def delete

- 如果我删除了一个人,那么他们会被软删除,但相关的帐户不会受到影响。

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

所以理想情况下,当我删除一个人时,我希望它软删除这个人,并且引用这个人的帐户也被软删除(将它们标记为非活动状态)。

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)
Run Code Online (Sandbox Code Playgroud)

更新:我已经更新了问题。我没有说我正在对 Person 模型运行软删除。还补充说,当 def 删除没有被覆盖时,级联删除工作,但是当我覆盖删除时,级联不会触发。

sha*_*nyu 5

您的Person模型当前不适合“软”删除。当你删除一个Person对象时,Django将删除所有相关的Account对象。如果要软删除Person对象,请在模型中为其添加一个标志Person。然后,您需要确保您的默认Account管理员排除那些与软删除的 Person 对象相关的帐户。

编辑:

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

      class AccountManager(models.Manager): 
          def get_query_set(self):
              return self.filter(person__active=True).filter(active=True)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 另一种方法是在软删除 Person 对象时将相关 Account 对象设置为“删除”。为此,您可以使用信号。我认为 Person 对象上的保存后信号是合适的。