Obtenga acceso a los objetos ForeignKey en el guardado principal en Django
-
19-08-2019 - |
Pregunta
Estoy tratando de hacer una imagen combinada de todas las imágenes agregadas a un modell en django con edición en línea y una ForeignKey. Tengo estos modelos (simplificados):
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)
Luego agrego Imagen al Modell con AdminInline, así que cuando guardo el Modell guardo x número de imágenes.
Pero cuando trato de hacer algo con Modell.images.all en la función on_modell_saved no puedo obtener los objetos. Tengo esta función que se ejecuta en Modell.save ()
def on_modell_saved(instance):
for img in instance.images.all():
print img
Esto solo imprime algo la segunda vez que guardo el Modell y no la primera vez. ¿Alguien sabe cómo llamar a una función después de guardar todos los elementos que está agregando con AdminInline?
Solución
Modell
y Image
son dos modelos separados conectados con una ForeignKey
. Aunque ambos parecen estar guardados juntos , no lo hacen. Se guardan uno por uno (primero el Modell
o primero el Image
s).
Ahora, lógicamente, las Imágenes
se guardan después de Modell
. Debido a que tienen un ForeignKey
que apunta a Modell
y si intenta guardarlos primero, porque no hay Modell
sí, no apuntarían a nada ( que es posible con null = True
).
Entonces, cuando Modell.save ()
se llama Image
s no existen.
La solución depende de lo que desee hacer ? Supongo que el objetivo aquí no es solo imprimir las Image
s.
Otros consejos
La instancia de Modell
no se guarda cuando agrega una nueva imagen; solo se guarda la instancia de Image
.
Mueva su llamada de función al modelo Image
y estará bien.
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)
Lo resolví de alguna manera, pero es una granja óptima, hice la función modell_on_save en Guardar imagen, esto funciona, pero lo malo es que si hay 5 imágenes relacionadas y guardadas en el modelo, habrá 5 llamadas a la función, y eso es malo. Me gustaría que solo suceda después de la última ...