我正在尝试覆盖名为 Invoice 的模型的 delete 方法。模型发票由模型 Action 中的 ForeignKey 引用。我想在删除发票时更新模型 Admin 中名为 billed 的 BooleanField
这篇文章中描述的解决方案:
How do I override delete() on a model and have it still work with related deletes
那个答案:
https://stackoverflow.com/a/1539182
在models.py中对我不起作用:
def delete(self):
Action.objects.filter(invoice=self).update(billed=False) # and tried 0 instead of False
super(Invoice,self).delete()
也试过:
def delete(self):
actions = Action.objects.filter(invoice=self)
for action in actions:
action.billed=False # and tried 0 instead of False
action.save()
super(Invoice,self).delete()
Model Action 中的 ForeignKey 字段有一个 on_delete=models.SET_NULL 以避免在删除发票时删除操作。但我还需要将 billed 设置回 False。
invoice = models.ForeignKey( Invoice, verbose_name = 'Rechnung', null=True, blank=True,on_delete=models.SET_NULL)
我刚读到这里 https://code.djangoproject.com/ticket/10751在 Admin 中,选择的操作删除不能被 delete() 覆盖
我必须改用 delete_view()
所以我试过了
def delete_selected(self, request, obj, extra_context=None):
Action.objects.filter(invoice=self).update(billed=False)
super(InvoiceAdmin, self).delete_view(request, obj, extra_context)
也尝试使用obj而不是self,但不是解决方案
最佳答案
虽然 this answer有效,如果您删除单个 obj
代码中的任何其他地方,delete_model
方法会抛出错误。
我推荐这个:
actions = ['delete_selected']
def delete_selected(self, request, obj):
for o in obj.all():
Action.objects.filter(invoice=o).update(billed=False)
o.delete()
delete_selected.short_description = 'Ausgewählte Rechnungen löschen'
只需覆盖
delete_selected
更改列表管理页面的操作。这样你就不必完全删除操作,覆盖 delete_model
方法,另外,您仍然可以从更改 <object>
中删除单个项目。管理页面。从长远来看,它的代码更少。 :)
关于django - 覆盖 delete_selected() 并更新子模型的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10814972/