型号:
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
定位为目标。
谢谢。
答案 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值。