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?

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top