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
しかし、それは問題を解決しませんでした。
どうすればこの動作を防ぐことができますか?