DRF:在字段中使用“源”进行序列化期间的奇怪行为

时间:2019-04-26 19:52:06

标签: django django-rest-framework deserialization serializer

型号:

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": "human@earth.com",
    "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操作中的create定位为目标。

谢谢。

1 个答案:

答案 0 :(得分:0)

如下更改您的序列化器,

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},
        }

并将创建有效负载更改为

{
    "user": 1,
    "occupation": "network engineer"
}

其中“ 1”是数据库中User对象的PK值。