首页 > 解决方案 > 如何序列化两个嵌套的 Django 表?

问题描述

我已经更新了帖子并粘贴了完整的代码。可以为我修复代码。实际上我想用专辑名称和多个图像发布数据并序列化两者,并且在 POST 请求中我想要整个提交的数据。方法。{名称:我最喜欢的歌曲列表媒体:[{媒体:文件名1,媒体:文件名2}]}

#views.py
@api_view(['POST'])
def addAlbum(request):
if request.method == 'POST':
    serializer = AlbumSerializer(data=request.data)
    albums = request.data.pop('media')
    if albums:
        name = Album.objects.create(name=request.data['name'])
        if serializer.is_valid():
            for file in albums:
                AlbumImages.objects.create(media = file, album = name)
            serializer.save()
            return Response(serializer.data, status.HTTP_201_CREATED)
        return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
    return Response("Please upload the files", status.HTTP_400_BAD_REQUEST)

return Response("Not found", status.HTTP_400_BAD_REQUEST)


#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__"

#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', on_delete=models.CASCADE)
media = models.ImageField(upload_to='album/images')

def __str__(self) -> str:
    return f'Files of ' + self.album.name

正在生成专辑,文件与专辑表相关联,但问题是我将如何序列化两个表以显示对发布请求的响应。等待帮助。

标签: pythondjangodjango-rest-framework

解决方案


我稍微调整了您的代码,但没有经过测试。如果您不想调整album-ForeignKey字段,则必须更改保存而不是使用的行为.objects.create()。它应该工作。

你写了很多验证。您的序列化程序可以做到这一点。例如,您可以extra_kwargs = {'media': {'required': True}在您的AlbumImage-serialzer 上使用。如果您需要更多解释,请不要问。

   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


推荐阅读