1

在 Django 应用程序(使用 DRF)中,我有一个用户配置文件模型。要更新个人资料信息,我想使用 PUT。但是,我有一个名为“元”的字段,它本身就是一个对象/字典。如果我遗漏了它的任何属性(性别、手机、生日),我将丢失这些数据,因为整个“元”都被新的替换了。任何字段都不会发生这种情况(例如,如果我不指定名字,该字段将保持不变)。以下是 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'
        ]
4

1 回答 1

1

覆盖update(...)序列化器的方法

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)
于 2020-09-25T14:04:38.630 回答