Сохранение имен изображений в базе данных — Django

#django #database

#django #База данных

Вопрос:

У меня есть следующая модель класса на моем веб-сайте Django:

 class Buy(models.Model):
    category = models.ForeignKey(Category, related_name='sell', on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    image = models.FileField()
    image2 = models.FileField(blank=True)
    description = models.CharField(max_length=300)
    date = models.DateField(default=timezone.now)
    buy_price = models.DecimalField(max_digits=6, decimal_places=2)
    sell_price = models.DecimalField(max_digits=6, decimal_places=2)
    seller = models.ForeignKey(Seller, on_delete=models.PROTECT)
    showcase = models.BooleanField(default=False)
  

Как вы можете видеть, я храню файлы фотографий с 2 полями: image и image2. Но теперь мой клиент попросил меня добавить больше фотографий. Я сомневаюсь:

  1. Должен ли я продолжать добавлять новые поля в этот класс, например, image3, image4, image5 и так далее? Проблема, которую я вижу: не в каждой записи будет так много фотографий, и большинство из них станут «пустыми».
  2. Должен ли я загружать только новые фотографии, не сохраняя их имена в базе данных? Таким образом, новые фотографии должны следовать за некоторым именем, связанным с полем класса изображения. Я имею в виду, unique_photo_1.jpg заходит внутрь поля изображения, unique_photo_2.jpg не сохраняется в базе данных, но имеет отношение к этому полю, а также unique_photo_3.jpg .

Какова наилучшая практика?

Спасибо!

Ответ №1:

В # 1 лучше всего следовать принципам нормализации базы данных и создавать отдельную Image модель, которая связана с вашей Buy моделью. Если вы предполагаете, что изображения могут быть повторно использованы в нескольких Buy экземплярах модели, используйте отношения «многие ко многим»; в противном случае используйте «многие к одному» (т. Е. ForeignKey ). Это означает удаление image и image2 из вашей Buy модели, а затем создание, например:

 class Image(models.Model):
    image = models.FileField()
    image_type = models.CharField()
    buy = models.ForeignKey(Buy, on_delete=models.PROTECT)
  

Под # 2, если вы имеете в виду, что рассматриваете возможность пропустить использование FileField или ImageField вместо этого написать код, который будет искать файлы в некотором пространстве хранения, то это не звучит как хорошая идея, потому что тогда вы отделяете свои файловые (метаданные) данные от остального содержимого вашей базы данных. Использование FiledField / ImageField также значительно упростит использование серверных систем хранения, таких как AWS S3.