Получите доступ к объектам ForeignKey при родительском сохранении в Django

Я пытаюсь создать объединенное изображение всех изображений, добавленных в модель в django, с встроенным редактированием и ForeignKey. У меня есть эти модели (упрощенные):

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_modell_saved, я не могу получить объекты. У меня есть эта функция, которая выполняется в Modell.save ()

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

Это печатает что-то только во второй раз, когда я сохраняю Modell, а не в первый раз. Итак, кто-нибудь знает, как вызвать функцию после того, как все элементы, которые вы добавляете с помощью AdminInline, сохранены?


person espenhogbakk    schedule 06.12.2008    source источник
comment
Что-то не так с форматированием кода в вопросе   -  person akaihola    schedule 27.02.2009


Ответы (3)


Modell и Image - две отдельные модели, связанные с ForeignKey. Хотя они оба кажутся спасенными вместе, это не так. Они сохраняются один за другим (сначала Modell или сначала Image).

Теперь логически Image сохраняются после Modell. Потому что у них есть ForeignKey, указывающий на Modell, и если вы попытаетесь сначала сохранить их, потому что Modell нет, да, они не будут указывать ни на что (что возможно с null=True).

Итак, к тому времени, когда Modell.save() будет вызван, Image не существует.

Решение зависит от того, что вы хотите сделать? Я полагаю, что цель здесь не просто распечатать Images.

person muhuk    schedule 06.12.2008
comment
Да, звучит примерно правильно, конечно, должна быть модель, прежде чем изображение можно будет сохранить и связать с ним. Нет, цель не только в том, чтобы распечатать изображения. В изображениях ive переопределил сохранение, чтобы превратить его в большие пальцы, а в режиме сохранения в Modell я хочу объединить все эти изображения в диафильм. - person espenhogbakk; 07.12.2008
comment
Я не понимаю, почему это должно быть Modell.save (), пока обновляется диафильм. Я бы хотел, чтобы вы указали это в своем вопросе. Потому что в этом случае все, что вам нужно сделать, это вызвать функцию Modell.update_filmstrip () из ImageManager.create () и Image.delete () (при условии, что изображения неизменяемы) - person muhuk; 07.12.2008

Экземпляр Modell не сохраняется при добавлении нового изображения; сохраняется только Image экземпляр.

Переместите вызов функции в модель 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)
person Daniel Naab    schedule 06.12.2008
comment
Я думаю, вы неправильно поняли, потому что я новее добавляю изображения вручную, но я добавляю изображения одновременно с добавлением новой модели. Я добавляю изображения прямо в форму добавления модели. Итак, Modell сохраняется, не так ли? Если вы сделаете это по-своему, on_image_saved вызывается один раз для каждого изображения, я не хочу этого ... - person espenhogbakk; 07.12.2008
comment
Внешний ключ находится в таблице Image, а не в таблице Modell, поэтому изображение не может быть добавлено, пока не будет создана Modell, на которую он ссылается. Они будут добавляться по одному, после экземпляра Modell я не вижу в этом проблемы. Но если это так, есть другие хуки, предоставляемые приложением администратора, которые могут помочь. - person Daniel Naab; 07.12.2008

Я решил это как-то, но это ферма от оптимальной, я выполнил функцию modell_on_save при сохранении изображения, это работает, но плохо то, что если есть 5 изображений, связанных и сохраненных в модели, будет 5 вызовов функции , а это плохо. Я бы хотел, чтобы это случилось только после последнего ...

person espenhogbakk    schedule 07.12.2008
comment
Вот как это сделать. Метод save () не имеет ничего общего с интерфейсом администратора ... он вызывается при всех сохранениях экземпляров модели, независимо от их источника. Если вы подключились только к сохранению администратора, у него была бы проблема не работать, если вы добавите изображение из оболочки или другим способом. - person Daniel Naab; 07.12.2008