2011-08-04 4 views
2

最初にdelete()メソッドをオーバーライドしようとしましたが、QuerySetの一括削除メソッドでは機能しません。それはpre_delete信号に関連するはずですが、私はそれを理解することはできません。私のコードは次の通りです:djangoでは、特定のタイプのインスタンスを削除する際に、関連オブジェクトをすべて削除する方法はありますか?

しかし、このメソッドは無限に呼ばれ、プログラムはデッドループになります。 誰か助けてくれますか?

答えて

7

クラスに外部キー(または関連するオブジェクト)がある場合、それらはデフォルトで削除されます(SQLのDELETE CASCADEなど)。

foreign_keyをクラスに定義するときには、on_delete引数を使用して動作を変更できますが、デフォルトではカスケードです。

は今here

pre_delete信号の動作を、それをチェックするが、そのは、オブジェクト単位でオブジェクトに削除いないので、あなたは一括削除を使用している場合には、delete()メソッドを呼び出していません。

1

あなたのケースでは、pre_deleteの代わりにpost_delete信号を使用すると、無限ループの問題を修正する必要があります。 ForeignKeyのon_deleteのデフォルト値であるcascadeのために、この方法でpre_deleteロジックを使用すると、instance.contextオブジェクトがトリガされてdelete on instanceを呼び出すと、instance.contextなどが呼び出されます。

このアプローチを使用する:

def _post_delete_problem(sender, instance, **kwargs): 
    instance.context.delete() 
    instance.stat.delete() 

post_delete.connect(_post_delete_problem, sender=Foo) 

は、あなたが望むクリーンアップを行うことができます。

関連する問題