DRF:在字段中使用“source”进行序列化时的奇怪行为

问题描述 投票:0回答:1

模型:

class Profile(models.Model):
    user       = models.ForeignKey(User)
    occupation = models.CharField()

串行:

class ProfileSerializer(serializers.ModelSerializer):
    user_id         = serializers.UUIDField(source="user.id")
    user_email      = serializers.EmailField(source="user.email", read_only=True)
    user            = serializers.UserSerializer(read_only=True)

    class Meta:
        model = Profile

当我使用retrieve动作,即/profiles/1/点击API时,它可以正常工作

样品回复:

{
    "user_id": "user_1",
    "user_email": "[email protected]",
    "occupation": "software engineer",
    "user": {
         "id": "user_1", "first_name": "", ....
    }
}

但是当我尝试通过提供如下数据来创建资源时:

{
    "user_id": "user_2",
    "occupation": "network engineer"
}

user_id字段成为服务器端的{"user": {"uuid": "requested_user_id"}},如下所示:

{
    "user": {
        "uuid": "user_2"
    },
    "occupation": "network engineer",
}

代替

{
    "user_id": "user_2",
    "occupation": "network engineer",
}

我通过记录serializer.validated_data调试了这个。

从DRF的角度来看,这是否是理想的行为?有没有简单的方法可以防止这种情况发生? (例如,在不更改原始定义字段名称的字段中的额外arg)

我在文档中查看了core arguments,但没有找到任何有用的信息。

我只是想在user_id行动中以qaxswpoi为目标。

谢谢。

django django-rest-framework deserialization serializer
1个回答
0
投票

如下所示更改序列化程序,

create

并将创建的有效负载更改为,

class ProfileSerializer(serializers.ModelSerializer):
    user_id = serializers.UUIDField(source="user.id", read_only=True)
    user_email = serializers.EmailField(source="user.email", read_only=True)

    class Meta:
        model = Profile
        fields = '__all__'
        extra_kwargs = {
            'user': {'write_only': True},
        }

其中“1”是DB中User对象的PK值。

© www.soinside.com 2019 - 2024. All rights reserved.