我在 django 管理中使用软删除,就像this http://codespatter.com/2009/07/01/django-model-manager-soft-delete-how-to-customize-admin/。
问题是,当我删除外键项目时,它似乎不会触发其链接到的所有项目的删除。或者也许它确实如此,但它没有运行自定义默认删除我的模型上有。
-如果我删除一个人,那么他们会被软删除,但相关帐户不会受到影响。
-如果我删除软删除,那么当我删除一个人时,帐户也会被删除,这是正确的。
因此,理想情况下,当我删除一个人时,我希望它软删除该人,并且引用该人的帐户也被软删除(将它们标记为非活动状态)。
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)
UPDATE:我已经更新了问题。我没有说过我正在对 Person 模型运行软删除。还补充说,当 def 删除未被覆盖时,级联删除可以工作,但是当我覆盖删除时,级联不会触发。
Your Person
模型当前不是为“软”删除而设计的。当您删除一个Person
对象,Django将删除所有相关的Account
对象。如果你想软删除Person
对象,为其添加一个标志Person
模型。然后你需要确保你的默认Account
manager 排除那些与软删除的 Person 对象相关的帐户。
Edit:
-
一种方法是让默认管理器排除与非活动 Person 对象相关的对象,而不是将它们设置为“已删除”:
class AccountManager(models.Manager):
def get_query_set(self):
return self.filter(person__active=True).filter(active=True)
另一种方法是在软删除 Person 对象时将相关 Account 对象设置为“删除”。为此,您可以使用信号。 A保存后信号 https://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.post_save我认为在 Person 对象上是合适的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)