簡體   English   中英

如何將POST數據發送到嵌套的Serializer Django Rest Framework?

[英]How to send POST data to nested Serializer Django Rest Framework?

我正在編寫一個示例程序,其中可以將標簽添加到待辦事項列表。 所以我創建了標簽樣本。 但是當我在將其添加到Todo序列化程序時遇到麻煩時。

這是我寫的序列化器。

class TagSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(required=False, max_length=100)

    def create(self, validated_data):
        return Tag.objects.create(**validated_data)

class LocationSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    latitude = serializers.CharField(max_length=100)
    longitude = serializers.CharField(max_length=100) 

    def create(self, validated_data):
        return Location.objects.create(**validated_data)

class ToDoSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    work_id = serializers.CharField(max_length=100)
    tags = TagSerializer(many=True)
    location = LocationSerializer()

我嘗試將數據作為POST發送到ToDo序列化程序。 但是如何將位置和標簽詳細信息發送到API視圖。

API視圖

class ToDoList(APIView):
    def post(self, request, format=None):
        serializer = ToDoSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我如何將數據作為POST傳遞到ToDoList。 我是否必須在ToDoSerializer上編寫自定義帖子視圖?

楷模

class Tag(models.Model):
    name = models.CharField(max_length=100)

class Location(models.Model):
    latitude = models.CharField(max_length=100)
    longitude = models.CharField(max_length=100)

class ToDo(models.Model):
    work_id = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)
    location = models.ForeignKey(Location)

您的請求POST數據應看起來像嵌套結構,如序列化程序中聲明的那樣。 並且,您應該為此使用模型序列化器,因為否則,您將不得不在ToDoSerializer上提供自定義create方法,因為常規序列化器不知道如何使用嵌套結構/模型。

所以,我建議的是:

from rest_framework import serializers

class ToDoSerializer(serializers.ModelSerializer):
    tags = TagSerializer(many=True)
    location = LocationSerializer()

    class Meta:
        model = ToDo
        fields = ('tags', 'location', 'work_id', 'id')

您的發布json應該如下所示:

{
    "work_id": 1,
    "tags" : [
        {"name": "blah"},
        {"name": "blahblah"}
    ],

    "location": {
        "latitude": 11.22,
        "longitude": 33.44
    }

}

您需要處理ToDoSerializer serialzier的create方法。 docs 嵌套嵌套表示形式

您可以嘗試如下操作:

def create(self, validated_data):
    location_data = validated_data.pop('location')
    tag_data = validated_data.pop('tags')
    location = Location.objects.create(**location_data)

    instance = ToDo.objects.create(location=location, **validated_data)

    for dct in tag_data:
        dct.pop('id', None)
        tag, created = Tag.objects.get_or_create(**dct)
        // tag = Tag.objects.create(**dct)
        instance.tags.add(tag)
    return instance

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM