Tengo 2 modelos como a continuación
class Product(models.Model): product_name = models.CharField(max_length=100) product_weight = models.CharField(max_length=30) class ProductImage(models.Model): product = models.ForeignKey(Product, on_delete=models.DO_NOTHING) image = models.ImageField(upload_to='/images/{product_id}/', blank=True)¿Cómo extraer product_id en el modelo ProductImage?
Gracias por adelantado.
Puede obtener el valor "sin procesar" de cualquier clave externa en Django agregando "_id" al nombre del campo
obj = ProductImage.objects.get() obj.product_id # Will return the id of the related product También puede simplemente seguir la relación, pero esto realizará otra búsqueda en la base de datos si la relación no se ha almacenado en caché usando algo como select_related
obj.product.idEsto es lo que he intentado hasta ahora y encontré la solución. La única opción que encontré para lograrlo es usar señales pre_save y post_save. Y así es como logré la solución. Si alguien tiene una solución diferente, por favor comparta. Gracias.
from django.db.models.signals import post_save, pre_save from django.dispatch import receiver _UNSAVED_IMAGEFIELD = 'unsaved_imagefield' def upload_path_handler(instance, filename): import os.path fn, ext = os.path.splitext(filename) return "images/{id}/{fname}".format(id=instance.product_id, fname=filename) class ProductImage(models.Model): product = models.ForeignKey(Product, on_delete=models.DO_NOTHING) image = models.ImageField(upload_to=upload_path_handler, blank=True) @receiver(pre_save, sender=ProductImage) def skip_saving_file(sender, instance, **kwargs): if not instance.pk and not hasattr(instance, _UNSAVED_IMAGEFIELD): setattr(instance, _UNSAVED_IMAGEFIELD, instance.image) instance.image = None @receiver(post_save, sender=ProductImage) def update_file_url(sender, instance, created, **kwargs): if created and hasattr(instance, _UNSAVED_IMAGEFIELD): instance.image = getattr(instance, _UNSAVED_IMAGEFIELD) instance.save()