如何在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()
当我删除 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()