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