Получить доступ к объектам ForeignKey при родительском сохранении в Django - PullRequest
1 голос
/ 06 декабря 2008

Я пытаюсь сделать объединенное изображение из всех изображений, добавленных в modell в 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)

Затем я добавляю изображение в Modell с AdminInline, поэтому, когда я сохраняю Modell, я сохраняю x количество изображений.

Но когда я пытаюсь что-то сделать с Modell.images.all в функции on_modell_saved, я не могу достать объекты. Я получил эту функцию, которая выполняется в Modell.save ()

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

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

Ответы [ 3 ]

3 голосов
/ 07 декабря 2008

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

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

Так что к тому времени Modell.save() называется Image с не существует.

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

1 голос
/ 06 декабря 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)
0 голосов
/ 07 декабря 2008

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

...