ForeignKey
s on django には、参照されたオブジェクトが削除されたときの動作を指定するon_delete属性があります。ManyToManyFieldに似たものを取得する方法はありますか?
次のモデルがあるとします
class House(models.Model):
owners = models.ManyToManyField(Person)
デフォルトの動作はカスケードです。そのため、たまたま家を所有している人を削除すると、その人は所有者から消えてしまいます (つまり、家を所有していないことは明らかです)。私が欲しいのは、人が所有者である場合、それは削除できないということです。つまり、欲しいon_delete=models.PROTECT
。これは可能ですか?
私は内部的ManyToManyField
に 2 つの s を持つ別のモデルForeignKey
(この場合は 1 つは家に、もう 1 つは人) に変換されることを知っているので、これを達成できるはずです。方法はありますか?through属性を新しいモデルに設定することは避けたいと思います。これにより、新しいテーブルが作成されるためです (古いテーブルを保持したい)。
編集:djangoが適切なm2mモデルを作成する場所を追跡しました:
def create_many_to_many_intermediary_model(field, klass):
from django.db import models
# ...
# Construct and return the new class.
return type(name, (models.Model,), {
'Meta': meta,
'__module__': klass.__module__,
from_: models.ForeignKey(klass,
related_name='%s+' % name,
db_tablespace=field.db_tablespace),
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
})
関連する行は
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
そうであってほしい
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace,
on_delete=models.PROTECT)
全体にモンキーパッチを適用し、ManyToManyField の新しいクラスを作成する以外に、これを行う方法はありますか?