Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django Rest框架中更新/追加serializer.data_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在Django Rest框架中更新/追加serializer.data

Python 在Django Rest框架中更新/追加serializer.data,python,django,django-rest-framework,Python,Django,Django Rest Framework,如何在Django Rest框架中更新/追加序列化程序.data data=serializer.data.update({“item”:“test”})不工作 返回响应(serializer.data,status=status.HTTP\u 201\u已创建) serializer.data是您没有 如果需要将额外数据传递给序列化程序的创建/更新,请在调用serializer.save()时执行此操作。不幸的是,serializer.data是类的属性,因此是不可变的。您可以将seriali

如何在Django Rest框架中更新/追加
序列化程序.data

data=serializer.data.update({“item”:“test”})不工作

返回响应(serializer.data,status=status.HTTP\u 201\u已创建)

serializer.data

您没有


如果需要将额外数据传递给序列化程序的创建/更新,请在调用serializer.save()时执行此操作。

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

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

序列化程序.data对象是不可变的ReturnList实例。解决此限制的方法是将
序列化程序.data
对象转换为简单的Python list(),然后附加所需的值,以便可以像下面这样使用转换后的list in 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)

然后,您的响应将有新的obj

我们可以使用
序列化程序更新响应中传递的数据。_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
序列化程序。_data
将创造奇迹。
参考:

或者,您可以使用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

我认为这对于在
响应
中传递不属于序列化程序/模型一部分的额外数据(因此未经验证)非常有用。这不会解决您希望序列化数据更新模型的情况。使用额外数据添加和更新模型会有什么用例?在这种情况下,最好修改序列化程序。我可以看到此解决方案对于在响应中添加一些计算数据或其他与资源无关的内容非常有用。@wdfc我想他可能在寻找以下内容:serializer=MySerializer(data=request.data,instance=model\u instance,partial=True)serializer.valid()serializer.save()我只需要做一个添加,那就是在我的fields=列表中添加'days'(自加入以来的天数)。这不在上面的示例代码中(或来自DRF文档),但在我的实现中是必需的。