2017-06-29 5 views
0

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.

  1. 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.

  2. Verwenden Signale Update abzufangen, bevor es das Update in der Datenbank zu machen versucht, und so etwas wie (1) durchführen

  3. 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.

Antwort

0

ich es noch nicht erhalten, aber:

FK ist FK, wir kümmern uns nur um FK_id es zu verlinken (1)

Sie Namen der Modelle und makemigrations ändern können (2)

# in SQL, i saw it create model_old, then create a new model and copy (for the function about add and remove field) 
# in makemigrations, when change name: it just run the Update query. 

Wenn Namen ändern, nichts zu Daten passieren, es aktualisieren nur den Namen (3)

Wenn Sie den Namen eines FK ändern (es nach wie vor nur den Namen wieder ändern) (4)

Von (1) können wir auf die Daten von FK zugreifen ~> Nichts über Namen ändern oder so etwas kann zu Problemen führen.

So:

So stellen Sie sicher, dass Sie eine gute Modelle erstellen.

Um Logik sollte vom Modell beginnen, und passen Sie mit Ihrer Idee.