在Django Rest框架中更新/合并数据,而不是将其替换为PUT方法
在Django应用程序(使用DRF)中,我有一个用户配置文件模型。要更新配置文件信息,我想使用PUT。但是,我有一个名为“meta”的字段,它本身就是一个object/dict。如果我丢失了它的任何属性(性别、手机、生日),我将丢失这些数据,因为整个“元”都被新的替换了。任何字段都不会出现这种情况(例如,如果我没有指定名字,字段将保持不变)。以下是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
{
"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()!我试着做类似的事情。你的解决方案非常有效!非常感谢你!!