[Django] Neuen One to Many Datensatz speichern
Verfasst: Sonntag 2. Dezember 2012, 00:33
Hallo Forum,
meines Wissens nach soll man 1:n Bzeihungen wie folgt speichern:
Das Schöne ist, dass man auch über den Lieferschein dank der Django-Magie gut an die Positionen kommt, nämlich über: Lieferschein.lieferscheinpositionen_set
Das funktioniert super. Man kann darüber auch problemlos Positionen hinzufügen: Lieferschein.lieferscheinposition_set.add(LieferscheinPosition)
Was mache ich aber wenn ich einen neuen Lieferschein anlege? Das ist etwas anders als die Reporter->Artikel-Beispiele im Internet, weil der Lieferschein und seine Positionen ja quasi zeitgleich anfallen.
Ich hatte gehofft, dass ich das in einem Rutsch machen kann:
Das funktioniert leider nicht. Beim Hinzufügen der Position gibt es einen Fehler, dass die id des Lieferscheins in der Lieferscheinpositon nicht null sein darf. Es scheint zu funktionieren wenn ich den Lieferschein, der ja eigentlich nur den "Kopf" repräsentiert, vorher speichere. Wenn dann aber etwas beim Speichern der Positionen ein Fehler auftritt, habe ich möglicherweise das Problem von Dateninkonsistenz, weil der Kopf da ist, die Positionen aber fehlen.
Gibt es hier eine gängige Möglichkeit?
Ich habe versucht für den entsprechenden View das Managment der Transaktion selbst zu lösen, aber das beschwört andere Probleme herauf. Zumindest bekomme ich immer beim Aufruf des Views den Fehler, das das die Transaktion noch aussteht (pending), obwohl es nur ein Ende der Funktion gibt und direkt davor ein Rollback ausgeführt wird.
Gruß
Sparrow
meines Wissens nach soll man 1:n Bzeihungen wie folgt speichern:
Code: Alles auswählen
class Lieferschein(models.Model):
# ...
class LieferscheinPosition(models.Model):
lieferschein = models.ForeignKey(Lieferschein)
Das funktioniert super. Man kann darüber auch problemlos Positionen hinzufügen: Lieferschein.lieferscheinposition_set.add(LieferscheinPosition)
Was mache ich aber wenn ich einen neuen Lieferschein anlege? Das ist etwas anders als die Reporter->Artikel-Beispiele im Internet, weil der Lieferschein und seine Positionen ja quasi zeitgleich anfallen.
Ich hatte gehofft, dass ich das in einem Rutsch machen kann:
Code: Alles auswählen
l = Lieferschein()
lp = LieferscheinPosition()
l.lieferscheinposition_set.add(lp)
l.save()
Gibt es hier eine gängige Möglichkeit?
Ich habe versucht für den entsprechenden View das Managment der Transaktion selbst zu lösen, aber das beschwört andere Probleme herauf. Zumindest bekomme ich immer beim Aufruf des Views den Fehler, das das die Transaktion noch aussteht (pending), obwohl es nur ein Ende der Funktion gibt und direkt davor ein Rollback ausgeführt wird.
Gruß
Sparrow