Accédez aux objets ForeignKey lors de l'enregistrement des parents dans Django
-
19-08-2019 - |
Question
J'essaie de créer une image combinée de toutes les images ajoutées à un modèle dans Django avec l'édition en ligne et une clé étrangère. J'ai ces modèles (simplifiés):
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)
Ensuite, j'ajoute une image au modèle avec AdminInline. Ainsi, lorsque je sauvegarde le modèle, je sauvegarde x nombre d'images.
Mais lorsque j'essaie de faire quelque chose avec Modell.images.all dans la fonction on_modell_saved, je ne peux pas obtenir les objets. J'ai cette fonction qui est exécutée à Modell.save ()
def on_modell_saved(instance):
for img in instance.images.all():
print img
Cela n’imprime quelque chose que la deuxième fois que j’enregistre le modèle, et non la première fois. Quelqu'un sait donc comment appeler une fonction après avoir enregistré tous les éléments que vous ajoutez avec AdminInline?
La solution
Modèle
et Image
sont deux modèles distincts connectés avec une ForeignKey
. Même s'ils semblent tous deux être sauvés ensemble , ils ne le font pas. Ils sont sauvegardés un par un (d’abord le Modell
ou d’abord les Image
).
Logiquement, les images
sont enregistrées après Modell
. Parce qu'ils ont une ForeignKey
pointant sur Modell
et si vous essayez de les sauvegarder en premier, car il n'y a pas de Modell
, ils ne pointeront vers rien ( ce qui est possible avec null = True
).
Donc, au moment où Modell.save ()
est appelé Image
, il n'existe pas.
La solution dépend de ce que vous souhaitez faire. ? Je suppose que l’objectif ici n’est pas simplement d’imprimer les images
s.
Autres conseils
L'instance de Modell
n'est pas enregistrée lorsque vous ajoutez une nouvelle image. seule l'instance Image
est en cours de sauvegarde.
Déplacez votre appel de fonction dans le modèle Image
et tout ira 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)
Je l’ai résolu d’une manière ou d’une autre, mais c’est une ferme optimale, j’ai fait la fonction modell_on_save lors de la sauvegarde d’images, cela fonctionne, mais le problème est que s’il y a 5 images liées et enregistrées dans le modèle, il y aura 5 appels à la fonction, et c'est mauvais. J'aimerais que cela ne se produise qu'après le dernier ...