Django Rest Framework - 更新外键

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字典的一部分.我已经读过嵌套关系是只读的.有人可以用简单的方式告诉我我需要做什么吗?

真的有义务.

提前致谢

gbs*_*gbs 7

由于在规定的文件,你需要编写自己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