django soft delete不会级联删除 [英] django soft delete doesn't cascade delete

查看:1165
本文介绍了django soft delete不会级联删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using a soft delete in my django admin, done like this. The issue is that when I delete a foreign key item, that it doesn't seem to trigger the deletes for all the items it's linked to. Or maybe it does but it's not running the custom def delete I have on my model.

- 如果我删除一个人,那么他们是软的 - 已删除,但相关帐户保持不变。

-If I delete a person then they are soft-deleted, but the related account is left untouched.

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

-If I remove the soft deletes, then when I delete a Person, the Accounts are deleted too which is correct.

所以理想情况下,当我删除一个人时,我想要它软删除Person和引用Person的帐户也被软删除(标记为不活动)

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删除不被覆盖时,级联删除工作,但是当我覆盖删除时,级联不会触发。

UPDATE: I have updated the question. I had not said that I'm running a soft delete on the Person model. Also added that when the def deletes are not overridden that the cascading deletes work, but when I do override the delete, the cascading doesn't trigger.

推荐答案

您的人员模型目前不适用于软删除。当您删除 Person 对象时,Django将删除所有相关的帐户对象。如果要软件删除 Person 对象,请在 Person 模型中添加一个标志。然后,您需要确保您的默认帐户管理员不包括与软删除的Person对象相关的帐户。

Your Person model is not currently designed for "soft" deletes. When you delete a Person object, Django will remove all related Account objects. If you want to soft-delete Person objects, add a flag for that in the Person model. Then you need to make sure that your default Account manager excludes those accounts that are related to a soft-deleted Person object.

编辑


  1. 一种方法是使默认管理器排除与非活动相关的对象人物对象而不是设置它们删除:

  1. One approach is making the default manager exclude the objects related to inactive Person objects instead of setting them "deleted":

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


  • 另一种方法是将Person对象软删除时,将相关的Account对象设置为已删除。为此,您可以使用信号。 后保存信号 on个人对象是合适的我认为。

  • Another approach would be setting your related Account objects "deleted" when a Person object is soft-deleted. For that, you could use a signal. A post-save signal on Person objects would be appropriate I think.

    这篇关于django soft delete不会级联删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆