DRF保存嵌套对象并更新另一个
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DRF保存嵌套对象并更新另一个相关的知识,希望对你有一定的参考价值。
我想更新实体并同时使用DRF和嵌套序列化器创建另一个实体。两个实体都以一对一的关系与常见的“根”连接
我的模型看起来像:
class Root(Model):
...
class Node1(Model):
root = OneToOneField(Root)
class Node2(Model):
root = OneToOneField(Root)
在我的场景中,Root和Node1的实体存在,我想在一个HTTP请求中更新node1并创建node2。
我尝试使用这样的序列化器:
class Node1Serializer(ModelSerializer):
class Meta(object):
model = Node1
fields = '__all__'
class Node2Serializer(ModelSerializer):
node1 = Node1Serializer(partial=True) # here I want update just few fields of node1
class Meta(object):
model = Node2
fields = '__all__'
我通过帖子发送数据,如:
{root: 1, entity2_param1: "...", "node1": {root: 1, id:1, entity1_param1: "..."}}
作为回应,我知道root必须是唯一的。这项任务的正确方法是什么?
答案
您的http请求的正文看起来像这样:
{
"node_1":{
"attribute_one":"attribute_one_data",
"attribute_two":"attribute_two_data",
...
"node_two": {
"attribute_one":"attribute_one_data",
...
}
}
然后在节点一的序列化程序更新方法中,您将执行以下操作:
def update(self, instance, validated_data):
# update any node_one fields you want
instance.attribute_one = validated_data.get('attribute_one', instance.attribute_one)
....
# check if node_two data was passed into request
if 'node_two' in validated_data:
data = validated_data.pop('node_two')
if data:
Node_Two.objects.create(root=root, **data)
缺少的一件就是你必须将root实例传递给update方法。你可以用几种不同的方式做到这一点。如果您需要帮助,请告诉我。
以上是关于DRF保存嵌套对象并更新另一个的主要内容,如果未能解决你的问题,请参考以下文章
如何在实例中有自定义 .update() 以更新 DRF 可写嵌套序列化程序中的多对多关系时更新值