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

标签 django model

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

相关文章:

python - 让 Django 识别 PIL JPEG 支持

python - 如何使 Django 通用 View 仅可供登录用户访问?

django - 检查 celery beat 是否启动并运行

c++ - QAbstractItemModel 线程安全

python - django外键保存文件名而不是对象

python - Django 中 Multi-Tenancy 的最佳解决方案是什么?

django - heroku 和 django,对于类型字符变化来说值太长(50)

python - Python 中的局部函数

python - 将 JSON 对象列表转换为 Django 模型实例

model - 为什么我的 Google BigQuery ML 数据集只有 2.4GB,但查询处理的字节数却是 100GB?