0

私はこれらのモデルを持っています。問題は、Django Admin を使用して犬のレコードを削除すると、関連する首輪のレコードが削除されないことです。

私はDjango 1.2を使用しています。カスケード削除がデフォルトだと思いました。Collar がレガシー テーブルにリンクされているのは問題ですか?

よろしくお願いします。

class Collar(models.Model):
    serial_number =  models.AutoField(primary_key=True, db_column='serial_number')
    weight = models.CharField(max_length=10)
    class Meta:
        db_table = u'existing_table_from_before_django_was_born'

class Dog(models.Model):
    size = models.CharField(max_length=10)
    collar = models.OneToOneField(Collar,blank=True, null=True, editable=False)
4

2 に答える 2

2

これは、レガシー テーブルへの接続の問題ではありません。カスケード削除は、Collar オブジェクトを削除すると機能し、関連する Dog オブジェクトが削除されます (おそらく、blank=True、null=True を削除した場合)。

Dog の削除後に Collar を削除するには、Dog の delete メソッドをオーバーロードする必要があります。

于 2012-09-07T18:51:26.180 に答える
2

関係と、削除カスケードが存在する理由について考える必要があります。FK がオンにDogなっています (フィールドは DB のテーブルにあります)。を削除するDogと、単に削除されDogます。それ以外は削除する必要はありません。ただし、 を削除すると、関連付けられている も削除されていないと、参照整合性の問題が発生するCollar可能性があります。Dogこの場合、フィールドは NULL 可能であるため、カラー フィールドを NULL に設定するだけで参照整合性の問題を修正できますが、他のシナリオでは、Dogデータベースの整合性を維持するために を削除する必要があります。

カスケード削除は非常に便利な場合が多いですが、その目的は作業を簡素化することではなく、データベースの整合性を維持することであることを覚えておくことが重要です。Collarその結果、問題が発生しないため、関係の反対側をクリーンアップする (削除するときに削除する)動機はありませDogん。

于 2012-09-07T19:11:18.783 に答える