【发布时间】:2012-05-30 11:02:53
【问题描述】:
我正在尝试覆盖名为 Invoice 的模型的删除方法。 Model Invoice 由模型 Action 中的 ForeignKey 引用。我想在删除发票时更新模型管理员中名为 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()
模型操作中的 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,但不是解决办法
【问题讨论】:
-
当您说“不工作”时,您的意思是,Action 对象没有被更新还是 Invoice 对象没有被删除,或者两者兼而有之?你是不是报错了?
-
发票正在更新(删除),但操作没有发生任何事情。操作 delete() 或 delete_selected() 未被覆盖。现在它可以与 get_actions 和 del deleted_selected 一起使用,并将自定义操作 delete_model 传递给模型。