11

Django の専門家からの ON DELETE CASCADE の Django の実装に関する私の理解の確認が必要です。

Djangoの公式ドキュメントによると:

Django がオブジェクトを削除するとき、デフォルトでは、SQL 制約 ON DELETE CASCADE の動作をエミュレートします。つまり、削除するオブジェクトを指す外部キーを持つオブジェクトはすべて削除されます。

「エミュレート」という言葉は、ON DELETE CASCADE ロジックが実際にはデータベース レベルではなく Django に実装されていることを意味しますか? (データベースを調べたところ、外部キーを含むすべてのテーブルの定義にON DELETE NO ACTIONが含まれています。)

私の理解が正しければ、ON DELETE CASCADEロジックをアプリ層からデータベース層に再配置する方法はありますか? 私はこれを行うためのハックではなく、適切な方法をもっと探しています。(注: バックエンドとして PostgreSQL を使用しています。)

4

2 に答える 2

8

関連するコードが実装されている場所を知りたい場合:ここで見つけることができます。

アプリケーション/ORM レイヤーに CASCADE-DELETE ロジックを実装することは理にかなっています。これにより、削除が発生したときにアプリに通知できるようになります (たとえば、削除されたインスタンスに対して Django の削除シグナルが発行されます)。さまざまな種類のデータベース。

データの整合性が心配な場合: データベースがこれをサポートしている場合、Django は依然として外部キー制約を設定します (例: Postgresql をチェックしてください)。したがって、データベースでは、外部キーが指している行を削除できません。

自分で試してみてください:

> DELETE FROM accounts_publisher WHERE id=5;
ERROR:  update or delete on table "accounts_publisher" violates foreign key constraint "accounts_publisher_id_411559b18a178e73_fk_accounts_publisher_id" on table "accounts_membership"
DETAIL:  Key (id)=(5) is still referenced from table "accounts_membership".
于 2015-03-23T10:28:56.377 に答える