Как анализировать имена файлов (изображений) и присваивать их модели?

#django #django-models

Вопрос:

Я относительно новичок в Django и создаю приложение для электронной коммерции. У меня есть папка с изображениями (они находятся в статическом каталоге) и множеством продуктов (~ 15000, я извлекаю данные продукта из API.). К сожалению, я не извлекаю данные изображения из API, вместо этого у меня есть папка со всеми изображениями, и их имя содержитфрагмент product.name струна.

 e.g
product.name = AH 285/55 R16 Turanza AH325
image_path = static/products/images/Turanza__1.png
 

Чего я пытаюсь добиться, так это следующего псевдокода:

 if product.name (the string) is contained in the image_name(path of the image), save the image and associate it with the model, otherwise pass.
 
 class Product(models.Model):
    code = models.CharField(primary_key=True, unique=True, max_length=15, null=False, blank=False)
    name = models.CharField(max_length=50, null=True, blank=True)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True, blank=True)
    price = models.FloatField(null=True, blank=True)

    image1 = ...
    image2 = ...
 

или

 class Image(models.Model):
    product = models.ForeignKey(Product, ...)
    name = models.CharField(...)
 

Как бы я подошел к этому? Может быть, свойство модели? Какова наилучшая практика для решения подобной проблемы? Может кто-нибудь указать мне правильное направление?

Ответ №1:

Первое, что приходит мне в голову, это передать дополнительный параметр экземпляру модели продукта при его создании, в данном случае имя файла. Что-то вроде этого

 class Product(models.Model):
    code = models.CharField(primary_key=True, unique=True, max_length=15, null=False, blank=False)
    name = models.CharField(max_length=50, null=True, blank=True)
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True, blank=True)
    price = models.FloatField(null=True, blank=True)

    image1 = ...
    image2 = ...

   @classmethod
   def create(cls, filename):
        product = cls(name=filename)
        return product
 

Тогда это будет работать следующим образом:

 product = Product.create("filename")
 

Ознакомьтесь с документацией.