6

mysqlデータベースのビューを表すmodels.Modelサブクラスがあります(つまり、managed = False)。

ただし、単体テストを実行すると、次のようになります。

DatabaseError:(1288、'DELETEのターゲットテーブルmy_view_tableは更新できません')

この削除要求のソースは、(間接的に)外部キーを介して行われます。私は(簡略化して)持っています:

class MyViewModel(models.Model):
    problematic_field = models.ForeignKey(ActualTableModel) # specifying on_delete=models.SET_NULL simply replaces the DELETE error with an UPDATE one

テストのティアダウン中に、ActualTableModelインスタンスを削除していますが、djangoは文書化された動作に従っているようです。

Djangoがオブジェクトを削除すると、SQL制約ON DELETE CASCADEの動作がエミュレートされます。つまり、削除するオブジェクトを指す外部キーを持つオブジェクトも一緒に削除されます。

これは、(managed = False)ビューに適用されたときに問題を引き起こしているようです。

削除を防ぐためにdeleteメソッドをオーバーライドしようとしました:

class MyViewModel(models.Model):
    ...
    def delete(self, *args, **kwargs):
        pass # deletion of a view row is never valid

しかし、それは問題を解決しませんでした。

どうすればこの動作を防ぐことができますか?

4

1 に答える 1

10

たぶん、さまざまなon_delete引数オプションの1つを試すことができますか?

つまり:

problematic_field = models.ForeignKey(ActualTableModel, on_delete=models.PROTECT)
于 2013-01-24T02:59:26.060 に答える