繁体   English   中英

Django DRF 嵌套串行器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM