python - 如何序列化两个嵌套的 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
正在生成专辑,文件与专辑表相关联,但问题是我将如何序列化两个表以显示对发布请求的响应。等待帮助。
解决方案
我稍微调整了您的代码,但没有经过测试。如果您不想调整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
推荐阅读
- go - 修改结构
- python - 我想使用 folium 包在给定特定日期时间及其纬度和经度的情况下按时间顺序显示不同 ID 的跟踪
- python - OpenCV - NoValueError - Tensorflow 对象检测
- java - 如何将输入从整数更改为字符?
- php - PHP Microsoft Graph SDK:如何处理 JSON 批量响应?
- visual-studio-code - 如何在 VS Code 语言扩展中优先考虑规则
- c - gl.h - 如何隐藏函数原型
- go - GORM AutoMigrate 有一个并且有很多:
- python - “c1xx:致命错误C1083:无法打开源文件:'cld3/pycld3.cpp':没有这样的文件或目录”使用pip安装pycld3时
- sql - 检查是否授权的程序