Django: как получить идентификатор внешнего ключа? - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть 2 модели, как показано ниже

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)

Как извлечь product_id в модели ProductImage?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Вы можете получить «сырое» значение любого внешнего ключа в Django, добавив «_id» к имени поля

obj = ProductImage.objects.get()
obj.product_id  # Will return the id of the related product

Вы также можете просто следовать за отношением, но это будет выполнять другую БД поиск, если отношения не были кэшированы с использованием чего-то вроде select_related

obj.product.id
0 голосов
/ 09 апреля 2020

Вот что я пробовал до сих пор и нашел решение. Единственный вариант, который я нашел для достижения, - это использование сигналов pre_save и post_save. И вот как я добился решения. Если у кого-то есть другое решение, пожалуйста, поделитесь. Спасибо.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...