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 删除没有被覆盖时,级联删除工作,但是当我覆盖删除时,级联不会触发。
您的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)
Run Code Online (Sandbox Code Playgroud)另一种方法是在软删除 Person 对象时将相关 Account 对象设置为“删除”。为此,您可以使用信号。我认为 Person 对象上的保存后信号是合适的。
归档时间: |
|
查看次数: |
6274 次 |
最近记录: |