DRF保存嵌套对象并更新另一个

时间:2018-04-07 13:33:24

标签: django django-models django-rest-framework

我想更新实体并同时使用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必须是唯一的。这项任务的正确方法是什么?

1 个答案:

答案 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实例传递给更新方法。你可以用几种不同的方式做到这一点。如果您需要帮助,请告诉我。