gpt4 book ai didi

Django Rest Framework - 更新外键

转载 作者:行者123 更新时间:2023-12-04 04:10:36 25 4
gpt4 key购买 nike

我对使用 Django Rest Framework 的这个问题感到有点沮丧:

我正在使用 View 集 ,带有 custom serializer .这个序列化程序有它的 depth set to 1 .当我查询这个 View 集时,我得到了正确的数据表示,例如:

data = {
id: 1,
issue_name: 'This is a problem',
status: {
id: 3,
name: 'todo'
}
}

问题我需要的时候进来 更新状态 .例如,如果我想为此问题选择另一个状态,例如:
status_new = {
id: 4,
name: 'done'
}

我将以下 PATCH 发送回服务器,这是输出:
data = {
id: 1,
issue_name: 'This is a problem',
status: {
id: 4,
name: 'done'
}

}

但是,状态不会更新。事实上,它甚至不是validated_data 字典的一部分。我读过嵌套关系是只读的。有人可以告诉我我需要以简单的方式执行此操作吗?

真的有义务。

提前致谢

最佳答案

documentation 中所述,您需要自己编写 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

我在评论中提到的原因是您可能需要添加 StatusSerializer字段用于获取状态 validated_data .如果我没记错的话,如果你只使用 depth那么嵌套对象可能不会在 update() 内被序列化/ create()方法(尽管我可能会误解)。无论如何,添加 StatusSerializer field 只是使用 depth=1 的显式形式

关于Django Rest Framework - 更新外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33077256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com