【问题标题】:Update/append serializer.data in Django Rest Framework [duplicate]在 Django Rest Framework 中更新/附加 serializer.data [重复]
【发布时间】:2026-01-15 12:10:01
【问题描述】:

如何在 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'>

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

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

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

    Read more about property

    【讨论】:

    • 我认为这对于在Response 中传递不属于序列化程序/模型的其他数据很有用(因此未经验证)
    • 这无法解决您希望序列化数据更新模型的情况。
    • 添加使用额外数据更新模型的用例是什么?在这种情况下,最好修改序列化程序。我可以看到这个解决方案对于在响应中添加一些计算数据或与资源无关的其他内容很有用。
    • @wdfc 我想他可能在找这个:serializer=MySerializer(data=request.data,instance=model_instance,partial=True) serializer.valid() serializer.save()
    【解决方案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
    

    【讨论】:

    • 我只需要添加一项,那就是将“days_since_joined”添加到我的字段 = 列表中。这不在上面的示例代码中(或来自 DRF 文档),但在我的实现中是必需的。
    【解决方案3】:

    你没有。

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

    【讨论】:

      【解决方案4】:

      我们可以用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

      【讨论】:

        【解决方案5】:

        serializer.data 对象是 ReturnList 的一个实例,它是不可变的。解决此限制的方法是将serializer.data 对象转换为简单的 Python list(),然后附加所需的值,以便您可以在 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)
        

        然后,您的响应将有您的新对象

        【讨论】:

          最近更新 更多