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

时间:2015-03-07 00:14:58

标签: django model

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

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

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

2 个答案:

答案 0 :(得分:1)

是和否。

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

my_obj.delete()

但是这种方法不会调用bulk queryset's delete()

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

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

答案 1 :(得分:1)

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

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()