In meiner Anwendung und Datenbank habe ich Compound
und Name
Modelle.Handhabung Django/Postgres Natural Foreign Key kaskadierende Updates
# possible names of compound
class Name(models.Model):
compound_name = models.TextField(primary_key=True)
# compound
class Compound(models.Model):
# unique id for the compound
compound_id = models.AutoField(primary_key=True)
# name representing the compound
primary_name = models.ForeignKey(Name, db_column='compound_name', null=True, db_index=True, on_delete=models.PROTECT)
Was ich möchte passieren haben ist, wenn ich einen Namen zu ändern, sagen ‚apsirin‘ auf ‚Aspirin‘, diese Änderung zu meiner Verbindung Kaskade würde.
Momentan funktioniert dies nicht, da Django diese FK-Beziehungen behandelt. Wenn ich einen Nameneintrag in Django aktualisiere, erstellt er eigentlich nur einen neuen Eintrag, und die alte Verbindung behält die Verbindung zur Verbindung bei.
Ich habe an 3 mögliche Lösungen gedacht, aber ich bin mir nicht ganz sicher, was alle Nachteile von jedem sind.
macht einen benutzerdefinierten ‚Update‘ -Funktion für meinen Namen, die ersten bekommt/den neuen Namen Eintrag erstellt, findet alle Verbindungen/andere Link-Tabellen mit Verweis auf die alten Namen, und ersetzt dann alle alten Benennen Sie Werte mit den neuen Namenwerten, bevor Sie den alten Namen endgültig löschen. Möglicher Nachteil ist, dass ich nicht weiß, wie dies funktionieren würde, wenn jemand django admin verwenden würde, um Namen zu aktualisieren.
Verwenden Signale Update abzufangen, bevor es das Update in der Datenbank zu machen versucht, und so etwas wie (1) durchführen
Erstellen Sie einen Trigger in Postgres etwas ähnliches (1), bevor die Durchführung von Aktualisierungen auftreten. Ich bin mir nicht ganz sicher, ob Django hier einen Fehler machen würde, da er sich des Auslösers nicht bewusst wäre.
Es ist möglich, ich bin mit Blick auf nur einige grundlegende Funktionalität von Modellen in models.py, und wenn ich bin, dann hoffentlich kann, dass dieses Problem lösen. Aber ich sehe keine Arten von on_update
Params für die FKs, und ich habe gelesen, dass das Django-Team dies als 'Problem reparieren' bezeichnet hat.