У меня есть модель 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).
Это хорошее решение для решения этой задачи? Можете предложить более оптимальную?
Актуален ли идентификатор для пользователя? Скорее всего нет. В этом случае вы можете просто отправить массив URL-адресов. Вы бы использовали StringRelatedField или MethodField в сериализаторе.
Вы также должны использовать ManyToManyField, так как ваша модель AlbumImage — это просто ассоциативная таблица. Если вам не нужны свойства ассоциации, такие как порядок, заголовок или описание, вам даже не нужно объявлять модель (Django создает для вас таблицу за кулисами).
Убедитесь, что prefetch_related в вашем наборе запросов, чтобы избежать серьезных проблем с производительностью.
Тогда что вы подразумеваете под "хорошее ли решение для этой задачи? Можете ли вы предложить более оптимальное?"? Кажется, это единственное решение, если вы не можете изменить формат вывода. Во всяком случае, другие, которые я предложил, все еще применяются.
Немного лучшим решением может быть использование сериализатора, который может обрабатывать обе модели, поэтому вам не нужно создавать два отдельных сериализатора. Вы можете использовать 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
для сериализации данных, а затем вернуть ответ.
спасибо за ответ, но формат json в вопросе является обязательным выводом, вы не можете его изменить