首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >django软删除不级联删除

django软删除不级联删除
EN

Stack Overflow用户
提问于 2011-07-04 08:38:49
回答 2查看 7.8K关注 0票数 7

我在我的django管理中使用了一个软删除,类似于。问题是,当我删除一个外键项时,它似乎不会触发它链接到的所有项的删除。也可能是这样,但它没有运行自定义的、def、删除模型上的

-If我删除了一个人,然后他们就被软删除了,但是相关的帐户没有被修改.

-If我删除软删除,然后当我删除一个人,帐户也被删除,这是正确的。

因此,理想情况下,当我删除一个人时,我希望它可以软删除该人,并且引用此人的帐户也被软删除(标记为非活动的)。

代码语言:javascript
运行
复制
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删除未被覆盖时,级联删除会工作,但当我重写删除时,级联不会触发。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-04 09:05:00

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

编辑:

  1. 一种方法是使默认管理器排除与非活动Person对象相关的对象,而不是将它们设置为“已删除”: 类AccountManager(models.Manager):def get_query_set(self):返回models.Manager
  2. 另一种方法是在Person对象被软删除时设置相关帐户对象“已删除”。为此,你可以用一个信号。我认为Person对象上的后存信号是合适的。
票数 5
EN

Stack Overflow用户

发布于 2011-08-12 20:31:47

另一种解决方案是使用django-softdelete,这是最近在github:https://github.com/scoursen/django-softdelete上出现的Django包。

如果您为您的模型使用提供的SoftDeleteObject混音,删除它们将自动导致软删除所有相关模型。更好的是,它存储与软删除相关的所有模型,这样您也可以通过一个取消删除调用来取消所有这些模型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6569121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档