3

Invoice という名前のモデルの削除メソッドをオーバーライドしようとしています。モデル Invoice は、モデル Action の ForeignKey によって参照されます。請求書が削除されたときに、モデル管理者で請求されたという名前の BooleanField を更新したい

この投稿で説明されているソリューション:

モデルで delete() をオーバーライドし、関連する削除で引き続き機能させるにはどうすればよいですか

その答え: 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を読みましたが、管理者では選択した削除アクションを 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 を使用しようとしましたが、解決策ではありません

4

2 に答える 2

7

私は解決策を見つけました。postet y Stephane https://stackoverflow.com/a/4534773/326905と私の問題のために編集しました。

正しいアクションは、 InvoiceAdminモデルのadmin.pyで delete_selected です 。

actions = ['delete_model']

def get_actions(self, request):
    actions = super(InvoiceAdmin, self).get_actions(request)
    del actions['delete_selected']
    return actions

def delete_model(self, request, obj):
    for o in obj.all():
        Action.objects.filter(invoice=o).update(billed=False)
        o.delete()

delete_model.short_description = 'Ausgewählte Rechnungen löschen'
于 2012-06-27T11:03:38.147 に答える