ForeignKey
s na django mają atrybut on_delete, aby określić zachowanie, gdy usuwany obiekt jest usuwany. Czy istnieje sposób, aby uzyskać coś podobnego dla ManyToManyField?django ManyToManyField i on_delete
Załóżmy, że mam następujący model
class House(models.Model):
owners = models.ManyToManyField(Person)
Domyślnym zachowaniem jest kaskadowo, więc jeśli mogę usunąć osobę, która dzieje się właścicielem domu, to po prostu znika z właścicieli (to jest, oczywiście, to nie dłużej posiada wszystkie domy). Chciałbym mieć to, że jeśli osoba jest właścicielem, nie można jej usunąć. To znaczy, chcę on_delete=models.PROTECT
. czy to możliwe?
Znam wewnętrznie ManyToManyField
został przetłumaczony na inny model z dwoma ForeignKey
s (w tym przypadku jeden do domu i jeden do osoby), więc powinno być możliwe do osiągnięcia tego. Wszelkie pomysły, jak? Chciałbym uniknąć ustawienia atrybutu through na nowy model, ponieważ spowodowałoby to utworzenie nowej tabeli (chciałbym zachować poprzednią).
Edit: Mam śledzone gdzie Django tworzy odpowiedni model 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)
})
Odpowiednia linia jest
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
Chciałbym go mieć
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace,
on_delete=models.PROTECT)
Jakikolwiek sposób to zrobić, oprócz małpowania łatania całej rzeczy i tworzenia nowej klasy dla ManyToManyField?
dzięki za odpowiedź. Nie wiedziałem, że mogę tak łatwo migrować dane, ale wyraźna tabela wygenerowałaby dla mnie za dużo kodu. Mam wiele ManyToManyField i nie chcę mieć wyraźnej tabeli dla każdego z nich i dlatego zdecydowałem się pójść z małpią łatając kod i po prostu zastępując ManyToManyField nową klasą ProtectedManyToManyField – Clash
@Clash.Cześć, jak zdołałeś wdrożyć ProtectedManyToManyField? –
@AndrewFount - Nie sądzę, że otrzymasz powiadomienie o tym inaczej, więc wspominam o Tobie w tym komentarzu. Clash opublikował go tutaj: http://stackoverflow.com/a/35827978/901641 – ArtOfWarfare