在Django Rest Framework中更新/附加serializer.data

时间:2016-05-09 08:37:09

标签: python django django-rest-framework

如何在Django Rest Framework中更新/附加serializer.data

data = serializer.data.update({“item”:“test”})无法正常工作

return Response(serializer.data, status=status.HTTP_201_CREATED)

serializer.data<class 'rest_framework.utils.serializer_helpers.ReturnDict'>

6 个答案:

答案 0 :(得分:19)

不幸的是,serializer.data是该类的属性,因此不可变。您可以serializer.data复制到另一个serializer.data ,而不是将项目添加到dict。你可以试试这个:

newdict={'item':"test"}
newdict.update(serializer.data)
return Response(newdict, status=status.HTTP_201_CREATED)

Read more about property

答案 1 :(得分:5)

你没有。

如果您需要将额外数据传递给序列化程序的创建/更新,请在调用serializer.save()as explained in the documentation

时执行此操作

答案 2 :(得分:2)

我们可以更新通过serializer._data

回复传递的数据

示例代码

class SampleAPIView(generics.CreateAPIView)
    serializer_class = SampleSerializer

    def perform_update(self, serializer):
        application = serializer.save(status='pending')
        my_response_data = {'id': 110, 'name': 'Batta'}
        serializer._data = out_data

serializer._data将成为魔术。 参考:https://github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py#L260

答案 3 :(得分:2)

或者,您可以使用SerializerMethodField通过向序列化程序添加自定义方法来添加其他数据。

http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

您可以使用这样的方法返回任何数据,无论是否在模型的上下文中。

class UserSerializer(serializers.ModelSerializer):
    days_since_joined = serializers.SerializerMethodField()

    class Meta:
        model = User

    def get_days_since_joined(self, obj):
        return (now() - obj.date_joined).days

答案 4 :(得分:1)

serializer.data对象是不可变的ReturnList实例。解决此限制的方法是将serializer.data对象转换为简单的Python列表(),然后追加所需的值,以便在Response()方法中使用转换后的列表,如下所示:

def get(self, request):
    serializer = YourAmazingSerializer(many=True)
    new_serializer_data = list(serializer.data)
    new_serializer_data.append({'dict_key': 'dict_value'})
    return Response(new_serializer_data)

然后,您的回复将包含您的新对象

答案 5 :(得分:-1)

@Linovia建议的内容外,您还可以执行以下操作:

serializer.data['item'] = 'test'

确保在调用serializer.is_valid之前调用此方法。

如果您想在serializer验证后添加数据,您应该这样做:

serializer.validated_data['item'] = 'test'