代码之家  ›  专栏  ›  技术社区  ›  espenhogbakk

在Django中的父存储中访问ForeignKey对象

  •  1
  • espenhogbakk  · 技术社区  · 17 年前

    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)
    

    然后,我使用AdminInline将图像添加到模型中,因此,当我保存模型时,我会保存x个图像。

    但是当我尝试使用Modell.images.all在on_model_saved函数中执行某些操作时,我无法控制对象。我得到了在model.save()上执行的这个函数

    def on_modell_saved(instance):
        for img in instance.images.all():
            print img
    

    这只在我第二次保存模型时打印,而不是第一次。那么,有人知道如何在保存使用AdminInline添加的所有项后调用函数吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   muhuk    17 年前

    Modell 和 Image 两个独立的模型是否连接到一个 ForeignKey . 尽管他们似乎都得救了 在一起 ,他们没有。它们一个接一个地保存(第一次保存) 模特儿 还是第一个 形象

    现在合乎逻辑 形象 有人救了我 之后 . 因为他们有一个 指向 模特儿 如果你想先救他们,因为没有 是的,他们不会指出任何东西(这在 null=True ).

    所以到那时 Modell.save() 形象 这是不存在的。

    Solution 取决于你想做什么?我想这里的目的不仅仅是打印 形象 s

        2
  •  1
  •   Daniel Naab    17 年前

    Modell 添加新图像时未保存实例;只有 Image 正在保存实例。

    将函数调用移动到 模特儿,你会很好的。

    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)
    
        3
  •  0
  •   espenhogbakk    17 年前