我想更新实体并同时使用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必须是唯一的。这项任务的正确方法是什么?
答案 0 :(得分:0)
您的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实例传递给更新方法。你可以用几种不同的方式做到这一点。如果您需要帮助,请告诉我。