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

use*_*812 8 python django django-rest-framework

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

data = serializer.data.update({"item":"test"})无效

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

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

Moh*_*f C 27

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

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

了解更多 property

  • 我认为这对于在 `Response` 中传递不属于序列化程序/模型(因此未经验证)的附加数据很有用 (3认同)
  • 使用额外数据添加更新模型有什么用例?在这种情况下,最好修改序列化器。我可以看到这个解决方案对于在响应中添加一些计算数据或与资源无关的其他内容很有用。 (2认同)

lge*_*pee 8

或者,您可以使用 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
Run Code Online (Sandbox Code Playgroud)


Lin*_*via 5

你不知道

如果您需要将额外的数据传递给序列化程序的创建/更新,请按照文档中的说明进行操作,同时调用serializer.save()


anj*_*505 5

我们可以更新响应中传递的数据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
Run Code Online (Sandbox Code Playgroud)

serializer._data将会创造奇迹。参考: https: //github.com/encode/django-rest-framework/blob/master/rest_framework/serializers.py#L260