Django - обновлять ForeignKey при создании нового объекта - PullRequest
1 голос
/ 27 мая 2020

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

модели:

from PIL import Image

class PhotoDimensionsCategory(models.Model):
     photo_dim_category = models.CharField(max_length=250)

class ImageInGallery(models.Model):
     image = models.ImageField(upload_to='photos/')
     gallery_dim = models.ForeignKey(PhotoDimensionsCategory, on_delete=models.CASCADE)

     def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        img = Image.open(self.image.path)
        on_height = PhotoDimensionsCategory.objects.get(photo_dim_category='on_height')
        on_width = PhotoDimensionsCategory.objects.get(photo_dim_category='on_width')
        is_new = not self.pk

        if img.height > img.width and is_new:
               # set the gallery_dim to on_height
        else
               # set the gallery_dim to on_width

Я пробовал несколько вещей, но все закончилось ошибками. Любые идеи. Спасибо.

ИЗМЕНИТЬ:

Если я попытаюсь использовать сигналы, он ничего не сделает:

@receiver(post_save, sender=ImageInGallery)
def set_dim(sender, instance, created, **kwardgs):
if created:
    instance.gallery_dim.photo_dim_category = 'on_height'
    instance.save()

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Я отвечал на это раньше здесь , однако это то, что вы ищете

   def save(self, *args, **kwargs):
        old_pk = self.pk # pk is created on saving, We didn't call super().save() yet!
        # so the pk should be None if this is the creation phase.

        if old_pk is None:
            # do something, Only at the first save 
        super().save(*args, **kwargs)

Сигналы могут помочь, но их сложнее отлаживать.

0 голосов
/ 27 мая 2020

В django есть «сигналы», которые вы можете вызывать при изменении или создании объекта:

from django.dispatch import receiver

@receiver(post_save, sender=ImageInGallery)
def set_dim(sender, instance, created, **kwargs):
    if created:
        PhotoDimensionsCategory.objects.create(...)
    else:
        instance.gallery_dim = ...

см. https://docs.djangoproject.com/en/3.0/topics/signals/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...