2012-11-06 12 views
12
gespeichert

Angenommen A und B django Model sind, wo A ein Fremdschlüsselfeld B hat:django: Zuordnung von Fremdschlüsseln vor Zielmodell

a = A() 
b = B() 
a.my_b = b 
b.save() 
a.save() 

Überraschenderweise a mit null im my_b Fremdschlüsselfeld gespeichert wird, . Wenn Sie a.my_b vor oder nach dem Speichern überprüft auf die b Instanz verweisen, jedoch scheint es, dass django die Fremdschlüssel-ID selbst auf a.my_b = b Zuweisung bewertet und nicht auf a.save(). In komplexen Systemen und fließt es schwierig sein kann, die Reihenfolge der Befehle zu ändern, einfach so b speichern, bevor es zu a Zuweisung unpraktisch sein könnte ...

die unglaubliche Aussage a.my_b=a.my_b zwischen dem Speicherbefehl Werk hinzufügen, aber mir scheint, ein schrecklicher Workaround.

Gibt es eine Möglichkeit, Django so zu konfigurieren, dass beim Speichern von Modellinstanzen Fremdschlüssel erneut ausgewertet werden?

Gibt es einen anderen Ansatz, der dieses Problem möglicherweise lösen könnte?

Antwort

7

Es gibt ein Django-Ticket, das dieses Problem beschreibt, #8892.

In der Zwischenzeit gibt es keine Konfigurationseinstellung, die das Verhalten ändert. Sie müssen die Reihenfolge Ihrer Speicherungs- und Zuweisungsvorgänge ändern oder die zusätzliche Zuweisung vornehmen.

+2

Dies hat mich gebissen, wenn ich versucht habe, Modellinstanzen dynamisch aus verschachtelten JSON-Daten zu erstellen. In meinem Fall konnte ich die Instanzen nicht speichern, bevor alle Felder bearbeitet wurden (was dazu führte, dass die zugehörigen Instanzen erstellt wurden), so dass ich vor der Zuweisung nicht speichern konnte. Stattdessen habe ich eine Liste von Funktionen erstellt, die aufgerufen werden, wenn die Instanzen alle verdrahtet sind. Zusätzlich zu der Speichermethode jeder Instanz habe ich eine 'partielle (setattr, name, value) 'hinzugefügt, so dass die zweifelhaften Zuordnungen in die Warteschlange gestellt wurden, bis die zugehörige Instanz gespeichert wurde. Leider sieht es nicht so aus, als würde # 8892 jemals behoben werden, aber zumindest werden sie einen Fehler hinzufügen. –

+0

@pluma könnten Sie Ihre Lösung erweitern? Ich habe das gleiche Problem. – bryanph

Verwandte Themen