Как сериализовать две вложенные таблицы django?

Models table

Serilizer file

views for adding albums

Альбом создается, файлы ассоциируются с таблицей альбомов, но вопрос в том, как мне сериализовать обе таблицы, чтобы показать ответ на пост запрос. жду помощи.

Вы можете создать другой 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

Вернуться на верх