Ottieni l'accesso agli oggetti ForeignKey al salvataggio dei genitori in Django
-
19-08-2019 - |
Domanda
Sto cercando di creare un'immagine combinata di tutte le immagini aggiunte a un modello in django con editing inline e ForeignKey. Ho questi modelli (semplificati):
class Modell(models.Model):
title = models.CharField('beskrivelse', max_length=200)
slug = models.SlugField()
is_public = models.BooleanField('publisert', default=True)
def __unicode__(self):
return self.title
def save(self, **kwargs):
super(Modell, self).save(**kwargs)
on_modell_saved(self)
class Image(models.Model):
modell = models.ForeignKey(Modell, related_name="images")
image = ThumbnailImageField('bilde', upload_to=get_upload_path_image)
class Meta:
verbose_name = 'bilde'
verbose_name_plural = 'bilder'
def __unicode__(self):
return str(self.image)
Quindi aggiungo Immagine al modello con AdminInline, quindi quando salvo il modello salvo x numero di immagini.
Ma quando provo a fare qualcosa con Modell.images.all nella funzione on_modell_saved non riesco a trovare gli oggetti. Ho questa funzione che viene eseguita su Modell.save ()
def on_modell_saved(instance):
for img in instance.images.all():
print img
Questo stampa qualcosa solo la seconda volta che salvo il modello e non la prima volta. Quindi qualcuno sa come chiamare una funzione dopo aver salvato tutti gli elementi che aggiungi con AdminInline?
Soluzione
Modell
e Image
sono due modelli separati collegati con un ForeignKey
. Anche se entrambi sembrano essere salvati insieme , non lo fanno. Vengono salvati uno per uno (prima il Modell
o prima il Image
)
Ora logicamente Immagine
viene salvata dopo Modell
. Poiché hanno un ForeignKey
che punta a Modell
e se provi prima a salvarli, perché non c'è Modell
sì, non indicherebbero nulla ( che è possibile con null = True
).
Quindi, quando Modell.save ()
viene chiamato Image
non esistono.
Solution dipende da cosa vuoi fare ? Suppongo che l'obiettivo qui non sia solo quello di stampare Image
.
Altri suggerimenti
L'istanza Modell
non viene salvata quando aggiungi una nuova immagine; viene salvata solo l'istanza Image
.
Sposta la tua chiamata di funzione nel modello Image
e sarai bravo.
def on_image_saved(instance):
for img in Image.objects.filter(modell=instance.modell)
print img
class Image(models.Model):
modell = models.ForeignKey(Modell, related_name="images")
image = ThumbnailImageField('bilde', upload_to=get_upload_path_image)
class Meta:
verbose_name = 'bilde'
verbose_name_plural = 'bilder'
def __unicode__(self):
return str(self.image)
def save(self, **kwargs):
super(Image, self).save(**kwargs)
on_image_saved(self)
L'ho risolto in qualche modo, ma è farm dall'ottimale, ho fatto la funzione modell_on_save sul salvataggio delle immagini, questo funziona, ma la cosa brutta che se ci sono 5 immagini correlate e salvate nel modello, ci saranno 5 chiamate alla funzione, e questo è male. Vorrei che succedesse solo dopo l'ultimo ...