gpt4 book ai didi

django - 覆盖 delete_selected() 并更新子模型的字段

转载 作者:行者123 更新时间:2023-12-03 10:28:09 24 4
gpt4 key购买 nike

我正在尝试覆盖名为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com