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 可写嵌套序列化程序中的多对多关系时更新值

如何在另一个 Fragment 中更新 ListView?

使用嵌套片段和动画对象

android片段-当另一个片段被推到它上面时如何保存片段中的视图状态

共享元素转换:活动到嵌套在另一个活动中的片段

如何在 React 中保存嵌套对象的状态?