如何在Django中实现自定义删除?

How to implement custom delete in Django?

当我删除 table-A 的记录时,我想将行移动到 table-A-history table。

覆盖管理器的 delete() 方法是否足以实际移动和删除?

我能找到的所有 soft delete 使用 bool 标志来指示软删除。

是也不是。

如果您覆盖 delete() 方法,则每次删除单个对象时都会调用该方法:

my_obj.delete()

但此方法不会在 bulk queryset's delete() 上调用。

MyModel.objects.filter(some=value).delete()

我怀疑您可以为此模型创建 custom QuerySet 并覆盖它的 delete() 方法。

我从来没有真正实现过您尝试创建的功能,但我认为覆盖核心功能可能不是最好的主意,尤其是因为它可能会让您感到有些困惑。我的建议是创建一个自定义删除方法,如下所示:

class Destination(modelsModel):
    title = models.Charfield(max_length=9000)
    [...]

class ItemToMove(models.Model):
    title = models.CharField(max_length=9000)
    [...same fields as "Destination" model...]

    def delete_and_move(self):
        Destination.objects.create(title=self.title, [...])
        self.delete()
        return "Object successfully deleted and moved"

    def __unicode__(self):
        return self.title

您可以使用它通过键入 obj.delete_and_move() 来删除单个对象,或者您甚至可以 运行 items = ItemToMove.objects.filter(title='barney'),然后通过以下方式删除:

for i in items:
    i.delete_and_move()