Архитектура БД для хранения списка изображений

У меня есть модель PhotoAlbum:

class PhotoAlbum(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, auto_created=True)
    name = models.CharField(max_length=50)

И мне нужно сохранить список фотографий, и когда я отправляю запрос GET, я должен видеть фотографии в формате, например:

ПОЛУЧИТЬ /альбомы

{
   'id': 'randomUUID',
   'name' : 'MyAlbum'
   'photos': [
        {
            "id": "randomUUID",
            "image": "photo.jpg",
        },
        {
            "id": "randomUUID",
            "name": "photo2.jpg",
        }
    ]
}

Итак, чтобы реализовать это, я хочу создать еще 2 модели:

class Image(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, auto_created=True)
    image = models.ImageField(upload_to='media/')

class AlbumImage(models.Model):
    album = models.ForeignKey(PhotoAlbum, on_delete=models.CASCADE)
    image = Image()

И создайте два сериализатора: для PhotoAlbum и для Image (чтобы показать URL).

Это хорошее решение для решения этой задачи? Можете предложить более оптимальную?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Актуален ли идентификатор для пользователя? Скорее всего нет. В этом случае вы можете просто отправить массив URL-адресов. Вы бы использовали StringRelatedField или MethodField в сериализаторе.

Вы также должны использовать ManyToManyField, так как ваша модель AlbumImage — это просто ассоциативная таблица. Если вам не нужны свойства ассоциации, такие как порядок, заголовок или описание, вам даже не нужно объявлять модель (Django создает для вас таблицу за кулисами).

Убедитесь, что prefetch_related в вашем наборе запросов, чтобы избежать серьезных проблем с производительностью.

спасибо за ответ, но формат json в вопросе является обязательным выводом, вы не можете его изменить

Anonymous Wizard 09.02.2023 16:23

Тогда что вы подразумеваете под "хорошее ли решение для этой задачи? Можете ли вы предложить более оптимальное?"? Кажется, это единственное решение, если вы не можете изменить формат вывода. Во всяком случае, другие, которые я предложил, все еще применяются.

Pedro Cavalheiro 09.02.2023 16:30
Ответ принят как подходящий

Немного лучшим решением может быть использование сериализатора, который может обрабатывать обе модели, поэтому вам не нужно создавать два отдельных сериализатора. Вы можете использовать ModelSerializer так:

class ImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = AlbumImage
        fields = ['id', 'image']

class PhotoAlbumSerializer(serializers.ModelSerializer):
    photos = ImageSerializer(many=True)
    class Meta:
        model = PhotoAlbum
        fields = ['id', 'name', 'photos']

Теперь вам нужно использовать PhotoAlbumSerializer для сериализации данных, а затем вернуть ответ.

Другие вопросы по теме