Django передает id из экземпляра в поле не инстанцированной модели

В моей модели ProductImages я сделал несколько полей для хранения различных типов одного и того же изображения, например:

models.py

class ProductImages(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    #This field is used in form    
    image_file_w200_png = models.ImageField(
        
        verbose_name = "Selecione a imagem",
        upload_to=upload_to_image_file_w200_png,
        null=True,
        blank=True,
        default='magickhat-profile.jpg'
    )
    #This field is not used in forms
    image_file_w480_png = models.ImageField(
        upload_to=upload_to_image_file_w480_png,
        null=True,
        blank=True,
        default='magickhat-profile.jpg'
    )
    ...

Ну, идея в том, что когда пользователь загружает изображение из поля image_file_w200_png, изображение изменяется до различных размеров, и я сохраняю эти другие изображения в других полях, например image_file_w480_png

Моя фактическая проблема заключается в upload_to, как мы можем видеть в docs, upload_to may also be a callable, such as a function. Поэтому я сделал свою собственную функцию в utils.py для upload_to для каждого поля.

utils.py

def upload_to_image_file_w200_png(instance, filename):
    ext = filename.split('.')[-1]
    filename = instance.product.slug+"_"+str(instance.id)+"_w200_png."+ext
    return 'user_{0}/{1}/{2}/{3}'.format(instance.product.user.id, instance.product.id, instance.id,  filename)

def upload_to_image_file_w480_png(instance, filename):
    ext = filename.split('.')[-1]
    filename = instance.product.slug+"_"+str(instance.id)+"_w480_png."+ext
    return 'user_{0}/{1}/{2}/{3}'.format(instance.product.user.id, instance.product.id, instance.id,  filename)

Проблема в том, что instance.id является id изображением поля, но единственное поле, которое инстанцируется, это поле image_file_w200_png, а image_file_w480_png нет, поэтому как я могу использовать instance.id из функции upload_to_image_file_w200_png в функции upload_to_image_file_w480_png?

upload_to вызывается для обоих ImageField, когда вы вызываете super(ProductImages, self).save(*args, **kwargs).

Установите self.image_file_w480_png = None перед super(ProductImages, self).save(*args, **kwargs).

if self.id is None:
    # saved_image_w200_png = self.image_file_w200_png
    # self.image_file_w200_png = None
    # super(ProductImages, self).save(*args, **kwargs)
    # self.image_file_w200_png = saved_image_w200_png

    # saved_image_w480_png = self.image_file_w480_png
    # self.image_file_w480_png = None
    # super(ProductImages, self).save(*args, **kwargs)
    # self.image_file_w480_png = saved_image_w480_png

    saved_image_w200_png = self.image_file_w200_png
    saved_image_w480_png = self.image_file_w480_png

    self.image_file_w200_png = None
    self.image_file_w480_png = None

    super(ProductImages, self).save(*args, **kwargs)

    self.image_file_w200_png = saved_image_w200_png
    self.image_file_w480_png = saved_image_w480_png
Вернуться на верх