2012-11-06 10 views
12

Assumere A e B sono modelli Django, dove A ha un campo chiave esterna per B:django: l'assegnazione di chiave esterna prima che il modello di destinazione viene salvato

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

Sorprendentemente a viene salvato con null nel campo chiave esterna my_b . Se si controlla a.my_b prima o dopo averlo salvato, fa fare riferimento all'istanza b, tuttavia sembra che django valuti l'id della chiave esterna stessa al momento dell'assegnazione a.my_b = b e non al numero a.save(). Nei sistemi complessi e dei flussi può essere difficile per cambiare l'ordine dei comandi, così semplicemente risparmiando b prima di assegnarlo a a potrebbe essere poco pratico ...

Aggiunta la dichiarazione incredibile a.my_b=a.my_b tra il salvare i comandi di opere, ma mi sembra una soluzione orribile.

C'è un modo per configurare django per rivalutare le chiavi esterne al salvataggio delle istanze del modello?

C'è un approccio diverso che potrebbe risolvere questo problema?

risposta

7

C'è un ticket Django che descrive questo problema, #8892.

Nel frattempo, non è presente alcuna impostazione di configurazione che modifichi il comportamento. Dovrai modificare l'ordine delle tue operazioni di salvataggio e assegnazione, oppure eseguire il compito extra.

+2

Questo mi ha colpito quando ho provato a creare dinamicamente istanze di modello da dati JSON nidificati. Nel mio caso non è stato possibile salvare le istanze prima che tutti i campi fossero gestiti (il che comporterebbe la creazione delle istanze correlate), quindi non è stato possibile salvare prima dell'assegnazione. Invece ho creato un elenco di funzioni da chiamare quando tutte le istanze erano state cablate. Oltre al metodo di salvataggio di ogni istanza ho aggiunto un 'partial (setattr, name, value)', quindi le assegnazioni oscure sono state messe in coda fino a quando l'istanza correlata non era stata salvata. Purtroppo non sembra che # 8892 sarà riparato ma almeno aggiungeranno un errore. –

+0

@pluma potresti espandere la tua soluzione? Sto affrontando lo stesso problema. – bryanph

Problemi correlati