在Django Rest框架中更新/合并数据,而不是将其替换为PUT方法

在Django Rest框架中更新/合并数据,而不是将其替换为PUT方法,django,django-rest-framework,put,Django,Django Rest Framework,Put,在Django应用程序(使用DRF)中,我有一个用户配置文件模型。要更新配置文件信息,我想使用PUT。但是,我有一个名为“meta”的字段,它本身就是一个object/dict。如果我丢失了它的任何属性(性别、手机、生日),我将丢失这些数据,因为整个“元”都被新的替换了。任何字段都不会出现这种情况(例如,如果我没有指定名字,字段将保持不变)。以下是PUT请求主体的示例: { "id": 1, "first_name": "Jane

在Django应用程序(使用DRF)中,我有一个用户配置文件模型。要更新配置文件信息,我想使用PUT。但是,我有一个名为“meta”的字段,它本身就是一个object/dict。如果我丢失了它的任何属性(性别、手机、生日),我将丢失这些数据,因为整个“元”都被新的替换了。任何字段都不会出现这种情况(例如,如果我没有指定名字,字段将保持不变)。以下是PUT请求主体的示例:

{
    "id": 1,
    "first_name": "Jane",
    "last_name": "Doe",
    "email": "jane@example.com",
    "meta": {
        "gender": "female",
        "mobile": 123456789,
        "birthday":"01-01-1970"
    }
}
我该如何确保丢失的财产不会丢失?是否有办法实现或强制将以前的数据与请求中的数据合并/更新

方法如下:

    def put(self, request, pk):
        user = User.objects.get(id=pk)
        serializer = UserSerializer(user, data=request.data, context={'request': request})
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
下面是序列化程序:

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = [
            'id',
            'url',
            'first_name',
            'last_name',
            'email',
            'meta'
        ]

重写序列化程序的更新(…)方法

class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = [
            'id',
            'url',
            'first_name',
            'last_name',
            'email',
            'meta'
        ]

    def update(self, instance, validated_data):
        instance_meta = instance.meta.copy()
        instance_meta.update(validated_data.get("meta", {}))
        validated_data["meta"] = instance_meta
        return super().update(instance, validated_data)
class UserSerializer(serializers.HyperlinkedModelSerializer):
类元:
模型=用户
字段=[
“id”,
“url”,
“名字”,
“姓”,
“电子邮件”,
“元”
]
def更新(自身、实例、已验证的_数据):
instance\u meta=instance.meta.copy()
实例_meta.update(已验证的_data.get(“meta”,{}))
已验证的\u数据[“元”]=实例\u元

return super()!我试着做类似的事情。你的解决方案非常有效!非常感谢你!!