2011-12-29 16 views
3

私はDjango 1.3をMySQL 5.5データベースバックエンドで使用しています。私の仮定は、デフォルトでは、Djangoはsyncdb経由でデータベースを構築する際に、関連オブジェクトのON DELETE CASCADEエフェクトをエミュレートするということでした。ただし、データベースを調べると、ON DELETEプロパティが実際には "RESTRICT"に設定されていることがわかります。これはバグですか?関連するレコードを削除できないので、関連するオブジェクトを持つオブジェクトを削除するときに、djang-adminにIntegrityErrorメッセージが表示され続けます。DjangoはMySQLを設定していませんDELETE = CASCADE

おかげ

+0

あなたが言ったことは正しいです。 Djangoは 'ON DELETE CASCADE'をエミュレートします。 DBMSのこの機能は使用しません。 Djangoは関連するモデルを削除するために必要なdelete文を発行します。なぜあなたはその問題を管理者に見ているのか分かりません。 –

答えて

2

Django 1.3.1は何らかの理由でON DELETE CASCADEプロパティをテーブルに適用できないようです。これはおそらく、Windows上で動作するMySQL-python 1.2.3インタフェースと関係があります。この問題を解決する唯一の方法は、custom SQLです。

+1

同じ問題があります。 –

1

Djangoはデフォルトでカスケードを行います。なぜ私はあなたがON DELETE RESTRICTを取得しているのかは分かりません。 Django 1.3では、(フィールドを定義するときにon_delete kwargを使用して)代替のON DELETEプロシージャを選択できます。データベース。

私は列を手動で変更してON DELETE CASCADEに戻すことをお勧めします。そしてそこから単に移動してください。私が言ったように、これは開発者がDjangoにしないことを伝えなければならないものです。それはデフォルトでカスケードされます。

+0

それは私のコードベースです。私はon_deleteオプションをCASCADE以外に設定したことはありません。私はpython manage.py sql app_nameコマンドを実行し、ON DELETE CASCADEへの参照がないことに気付きました。奇妙なことが起こっている、私はそれが何であるかを知ることができません。 –

5

Django は、Pythonで ON DELETE CASCADEをエミュレートします。そのため、データベーステーブルに設定する必要はありません。実際には、RESTRICTを設定することは意味をなさないかもしれません。というのも、管理者がそれに関連する警告を表示せずに、誤って関連するオブジェクトを削除することはできないからです。

あなたのケースでは、Djangoが知らない外部キー制約が設定されている可能性があります。あるいは、未処理のSQLを削除しようとしている可能性があります。あなたの質問から私は分かりません。

管理者またはORMから削除できないという問題がある場合は、モデルが正しく定義されていることを確認する必要があります。 djangoは関連するオブジェクトを収集し、カスケード自体を実行します。

削除が未処理SQLから機能しないという問題がある場合は、まず関連オブジェクトを手動で削除するか、SQL制約を緩和する必要があります。その場合、カスケードに変更することは正しい溶液。

+0

おそらく、このコメントがDjango 1.9を使用して変更されたことがあります。制約はエミュレートされず、カスケードが適用されずに作成されています。 – AaronM

関連する問題