Erhalten Sie Zugriff auf ForeignKey Objekte bei Mutter speichern in Django
-
19-08-2019 - |
Frage
Ich versuche, ein kombiniertes Bild aller Bilder auf ein Modell in django mit Inline-Editing und ein ForeignKey hinzugefügt zu machen. Ive erhielt diese Modelle (vereinfacht):
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)
Dann füge i Bild zum Modell mit AdminInline, so, wenn ich das Modell speichern i x Anzahl der Bilder zu speichern.
Aber wenn ich versuche, etwas mit Modell.images.all in der on_modell_saved Funktion tun kann ich nicht halten, die Objekte bekommen. Ive erhielt diese Funktion, die bei Modell.save ()
ausgeführt wirddef on_modell_saved(instance):
for img in instance.images.all():
print img
Diese druckt nur etwas das zweite Mal, dass ich das Modell und nicht das erste Mal speichern. So jemand wissen, wie eine Funktion aufrufen, nachdem alle Elemente, die Sie hinzufügen, mit AdminInline gespeichert wird?
Lösung
Modell
und Image
sind zwei separate Modelle mit einem ForeignKey
verbunden. Auch wenn sie beide gerettet zu werden scheinen zusammen , tun sie es nicht. Sie werden gespeichert nacheinander (zuerst die Modell
oder zuerst die Image
s).
Jetzt logisch Image
s gespeichert nach Modell
. Weil sie eine ForeignKey
zeigt auf Modell
und wenn Sie versuchen, sie zuerst zu retten, weil es keine Modell
ist ja, würden sie auf nichts verweisen (die mit null=True
möglich ist).
So durch die Zeit Modell.save()
heißt Image
s gibt es nicht.
Lösung hängt davon ab, was Sie tun möchten, ? Ich nehme an, das Ziel ist hier nicht nur die Image
s ausdrucken.
Andere Tipps
Die Modell
Instanz nicht gespeichert werden, wenn Sie ein neues Bild hinzufügen; nur die Image
Instanz gespeichert wird.
Bewegen Sie den Funktionsaufruf in das Image
Modell und Sie werden gut sein.
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)
ich dit es lösen irgendwie, aber es ist Farm nicht optimal, ich die modell_on_save Funktion auf Bild speicherte, das funktioniert, aber das Schlimme, dass, wenn es 5 Bilder auf dem Modell bezogen und gespeichert wird, wird es fünf Anrufe werden auf die Funktion, und das ist schlecht. Ich mag es nur geschehen nach dem letzten ...