Nav*_*Nav 9 django django-rest-framework
使用Django Rest框架我对此问题感到有点沮丧:
我使用的视图集中,具有custom serializer.这个序列化器有它的depth set to 1.当我查询这个视图集时,我得到了正确的数据表示,例如:
data = {
id: 1,
issue_name: 'This is a problem',
status: {
id: 3,
name: 'todo'
}
}
Run Code Online (Sandbox Code Playgroud)
当我需要更新状态时,问题就出现了.例如,如果我想为此问题选择其他状态,例如:
status_new = {
id: 4,
name: 'done'
}
Run Code Online (Sandbox Code Playgroud)
我将以下PATCH发送回服务器,这是输出:
data = {
id: 1,
issue_name: 'This is a problem',
status: {
id: 4,
name: 'done'
}
}
Run Code Online (Sandbox Code Playgroud)
但是,状态不会更新.事实上,它甚至不是validated_data字典的一部分.我已经读过嵌套关系是只读的.有人可以用简单的方式告诉我我需要做什么吗?
真的有义务.
提前致谢
由于在规定的文件,你需要编写自己create()和update()方法,在你的串行器,支持写入嵌套数据.
您还需要显式添加状态字段而不是使用depth参数,否则我相信它不会自动添加到validated_data.
编辑:也许我的细节有点短:你想要做的是覆盖ModelIssueSerializer中的更新.这基本上会拦截串行器级别的PATCH/PUT请求.然后获取新状态并将其分配给实例,如下所示:
class StatusSerializer(serializers.ModelSerializer):
class Meta:
model = Status
class ModelIssueSerializer(serializers.ModelSerializer):
status = StatusSerializer()
# ...
def update(self, instance, validated_data):
status = validated_data.pop('status')
instance.status_id = status.id
# ... plus any other fields you may want to update
return instance
Run Code Online (Sandbox Code Playgroud)
我在评论中提到您可能需要添加StatusSerializer字段的原因是为了获取状态validated_data.如果我没记错的话,如果你只使用depth那么嵌套对象可能不会在update()/ create()methods中被序列化(虽然我可能会误认为).无论如何,添加StatusSerializer字段只是使用的明确形式depth=1
| 归档时间: |
|
| 查看次数: |
6830 次 |
| 最近记录: |