ForeignKey
на django есть атрибут on_delete, чтобы указать поведение при удалении объекта ссылки. Есть ли способ получить что-то подобное для ManyToManyField?
Предположим, что у меня есть следующая модель
class House(models.Model):
owners = models.ManyToManyField(Person)
Поведение по умолчанию - это каскад, поэтому, если я удалю человека, который имеет собственный дом, он просто исчезнет у владельцев (то есть, очевидно, он больше не владеет никакими домами). Я бы хотел, чтобы, если человек является владельцем, его нельзя удалить. То есть, я хочу on_delete=models.PROTECT
. Возможно ли это?
Я знаю, что внутренне ManyToManyField
переводится в другую модель с двумя ForeignKey
(в этом случае один для дома и один к человеку), поэтому этого должно быть возможно. Любые идеи, как? Я бы не хотел устанавливать атрибут 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?