#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. Но теперь мой клиент попросил меня добавить больше фотографий. Я сомневаюсь:
- Должен ли я продолжать добавлять новые поля в этот класс, например, image3, image4, image5 и так далее? Проблема, которую я вижу: не в каждой записи будет так много фотографий, и большинство из них станут «пустыми».
- Должен ли я загружать только новые фотографии, не сохраняя их имена в базе данных? Таким образом, новые фотографии должны следовать за некоторым именем, связанным с полем класса изображения. Я имею в виду, 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.