Acesso chegar a ForeignKey objetos no pai, salvo em Django
-
19-08-2019 - |
Pergunta
Eu estou tentando fazer uma imagem combinada de todas as imagens adicionadas a um modell no Django com linha edição e um ForeignKey. Eu tenho esses modelos (simplificado):
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)
Então eu adicionar imagem para o Modell com AdminInline, então quando eu salvar o Modell i save x número de imagens.
Mas quando eu tento fazer algo com Modell.images.all na função on_modell_saved eu não posso começar a preensão dos objetos. Eu tenho essa função que é executada no Modell.save ()
def on_modell_saved(instance):
for img in instance.images.all():
print img
Isso só imprime algo a segunda vez que eu salvar o Modell e não pela primeira vez. Então conheço ninguém como chamar uma função após todos os itens que você está adicionando com AdminInline é salvo?
Solução
Modell
e Image
dois modelos separados conectados com um ForeignKey
. Mesmo que ambos parecem ser salvo juntos , eles não. Eles são salvos, um por um (primeiro o Modell
ou primeiro as Image
s).
Agora, logicamente Image
s são salvos depois Modell
. Porque eles têm um apontador ForeignKey
para Modell
e se você tentar salvá-los em primeiro lugar, porque não há nenhuma sim Modell
, eles apontam para nada (o que é possível com null=True
).
não existem Então, no momento Modell.save()
é chamado Image
s.
Solution depende do que você quer fazer ? Suponho que o objetivo aqui não é apenas imprimir os Image
s.
Outras dicas
A instância Modell
não está sendo salvo quando você adicionar uma nova imagem; apenas a instância Image
está sendo salvo.
Mova seu chamada de função no modelo Image
e você vai ser bom.
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)
I Dit resolvê-lo de alguma forma, mas é fazenda de ser ideal, eu fiz a função modell_on_save na imagem salvar, isso funciona, mas a única coisa ruim que, se há 5 imagens relacionadas e guardadas no Modell, haverá 5 chamadas para a função, e isso é ruim. Eu gostaria que acontecesse somente após o último ...