python - Django DRF 嵌套序列化器
问题描述
我是 DRF 的新手,正在尝试编写用于在照片上存储矩形标签的 API 原型。我的模型:
class Image(models.Model):
file = models.FileField(blank=False, null=False)
class Label(models.Model):
image = models.ForeignKey(Image, blank=True, on_delete=models.CASCADE)
start_x = models.IntegerField(default=0)
start_y = models.IntegerFIeld(default=0)
end_x = models.IntegerField(default=0)
end_y = models.IntegerField(default=0)
我的序列化器:
from rest_framework import serializers
class LabelSerializer(serializers.ModelSerializer):
class Meta:
model = Label
fields = ['id', 'image', 'start_x', 'start_y', 'end_x', 'end_y']
class ImageSerializer(serializers.ModelSerializer):
labels = LabelSerializer(many=True, read_only = True)
class Meta:
model = Image
fields = ['id', 'file', 'labels']
在以下视图中创建新图像对象时,我得到图像对象,但没有创建标签对象:
from .serializers import ImageSerializer
class ImageView(APIView):
parser_classes = (MultiPartParser, FormParser)
def post(self, request, *args, **kwargs):
serializer = ImageSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
response_data = {'id': serializer.data['id']}
return Response(response_data,
status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
API 调用: curl -i -X POST -H "Accept: application/json" -H "Content-Type: multipart/form-data" -F "file=@~/test.jpg" --form-string 'labels ={[{"start_x": 0, "start_y": 0, "end_x": 100, "end_y": 200}]}' http://127.0.0.1:8000/api/create/
我应该如何修改 ImageSerializer 以便通过一个 API 调用创建带有标签的图像?
解决方案
您必须为嵌套的序列化程序编写 Create 和 Update 方法,因为 DRF 无法处理此问题。您可以为 ImageSerialzier 正确创建自己的方法,如下所示:
class ImageSerializer(serializers.ModelSerializer):
labels = LabelSerializer()
class Meta:
model = Image
fields = ['id', 'file', 'labels']
def create(self, validated_data):
labels_data = validated_data.pop('labels')
labels = Label.objects.create(**validated_data)
Image.objects.create(labels=labels, **labels_data)
return labels
推荐阅读
- javascript - 无法显示 responseJson 的结果
- regex - 如何删除角色的特定实例,但不是全部?
- javascript - 在数组中迭代一个数组并显示 playerId、playerName 和 playerCategory
- javascript - SignalR v2 Javascript API 文档在哪里?
- r - 配对图未从闪亮下载
- python - 金字塔+ MySQL
- ios - iOS Swift,“在我的 iPhone 上”文件夹的 url 是什么
- docusignapi - 从 DocuSign Rest API 调用 GetDocument 时如何使用加密
- mysql - 从 ISP 服务器下载 MySQL 数据库到 localhost
- java - 是否有必要在可能被单线程调度程序修改的字段上使用 Java 同步?