Как сериализовать две вложенные таблицы django?
Альбом создается, файлы ассоциируются с таблицей альбомов, но вопрос в том, как мне сериализовать обе таблицы, чтобы показать ответ на пост запрос. жду помощи.
Вы можете создать другой ModelSerializer для AlbumImage, например:
class AlbumImageSerializer(serializers.ModelSerializer):
class Meta:
model = AlbumImages
fields = ('media',)
Затем в своем AlbumSerializer
замените:
albumimages = StringRelatedField(many=True, read_only=True)
By:
albumimages = AlbumImageSerializer(many=True, read_only=True)
Больше информации об этом можно найти в документации DRF.
Я немного подправил ваш код, но он не был протестирован.
Если вы не хотите корректировать поле album
-ForeignKey
, вы должны изменить поведение сохранения вместо использования .objects.create()
. Это должно сработать.
Вы написали много валидаций. Ваш сериализатор может это сделать. Например, вы можете использовать extra_kwargs = {'media': {'required': True}
в вашем AlbumImage
-сериализаторе. Если вам нужно больше объяснений, не стесняйтесь спрашивать.
album = Album(**validated_data)`
album.albumimages = albumimages_set
album.save()
#views.py
class AlbumView(APIView):
def post(self, request, *args, **kwargs):
resp = Response()
serializer = AlbumSerializer(data=request.data)
if serializer.is_valid():
resp.data = serializer.save()
else:
resp.status_code = HTTP_400_BAD_REQUEST
resp.data = serializer.errors
return resp
#serializers.py
class AlbumImagesSerializer(serializers.ModelSerializer):
class Meta:
model = AlbumImages
fields = "__all__"
class AlbumSerializer(serializers.ModelSerializer):
albumimages = AlbumImagesSerializer(many=True, read_only=True)
class Meta:
model = Album
fields = "__all__"
def create(self, validated_data):
albumimages = validated_data.pop('albumimages')
albumimages_set = [AlbumImages.objects.create(**element) for element in albumimages ]
album = Album.objects.create(**validated_data)
album.albumimages.set(albumimages_set)
album.save()
return album
#models.py
class Album(models.Model):
name = models.CharField(max_length=30, null=False, blank=False)
def __str__(self):
return self.name
class AlbumImages(models.Model):
album = models.ForeignKey(Album, related_name='albumimages', blank=True, null=True, on_delete=models.CASCADE)
media = models.ImageField(upload_to='album/images')
def __str__(self) -> str:
return f'Files of ' + self.album.name