Django序列化POST& PUT请求在嵌套对象中

时间:2018-03-09 21:07:40

标签: python django django-models django-rest-framework

我正在使用Writable Nested Serializer来序列化我的请求。当数据嵌套在1层时,我没有问题序列化做PUT / POST。

(即{name:'personA', project:{ name:'projA', client:'clientA'}}

然而,当它嵌套在2层时遇到了问题 - 我无法弄清楚如何修改update()函数。请帮忙!

数据样本

{
    "id": 6106,
    "name": {
        "id": 213,
        "name": "personA"
    },
    "project": {
        "id": 1663,
        "project": "ProjectA",
        "client": {
            "id": 72,
            "name": "ClientA"
        },
        "project_manager": {
            "id": 32,
            "name": "personB"
        }
    },
    "booking": 100,
    "date": "2017-12-01"
}

serializers.py

class projectSerializer(serializers.ModelSerializer):
    client = clientSerializer()
    project_manager = userSerializer()
    class Meta:
        model = project
        fields = ('id', 'project', 'client', 'project_manager')

class bookingListSerializer(serializers.ModelSerializer):
    project = projectSerializer()
    name = userSerializer()
    class Meta:
        model = bookingList
        fields = ('id', 'name', 'project', 'booking', 'date')

    def update(self, instance, validated_data):
        project_data = validated_data.pop('project')
        name_data = validated_data.pop('name')
        try:
            project_instance = project.objects.filter(**project_data)[0]
            name_instance = user.objects.filter(**name_data)[0]
        except IndexError:
            raise serializers.ValidationError
        # update the project if request is valid
        instance.project = project_instance
        instance.name = name_instance
        instance.save()
        return instance

views.py

# other viewsets...
class bookingListViewSet(viewsets.ModelViewSet):
    queryset = bookingList.objects.all()
    serializer_class = bookingListSerializer

0 个答案:

没有答案