[英]Django DRF nested serializer
我是 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']
在以下视图中创建新图像 object 时,我得到图像 object,但没有创建标签对象:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.