Django:如何从一个POST请求中保存两个模型(表)中的数据?

时间:2015-12-28 06:04:28

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

我想从单个POST请求中保存两个模型中的数据。 两个模型(ModelA,ModelB)具有相同的结构。

请求使用Django-Rest-Framework通过RESTful API传递。

我尝试将update_or_create()放入def perform_create(),如下所示,但失败了。 因为,它要求每个输入数据都应该是Model个实例。 我不知道如何在def perform_create()下获取实例 此外,我认为我的做法并不好。

所以我正在考虑另一种方式,例如django信号(post_save,pre_save等)。

请提供任何提示或提示。

这是我的 models.py

class ModelA(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    fieldC = models.ForeignKey(ModelC)

class ModelB(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    fieldC = models.ForeignKey(ModelC)

views.py

class View(generics.ListCreateAPIView):
    serializer_class = ModelA_Serializer
    queryset = ModelA.objects.all()

    def perform_create(self, serializer):

        #######################################################
        ### I tried update_or_create ModelB, but it failed.####
        ### And, It's not nice way.############################
        #######################################################

        fieldC_req = int( self.request.POST.get('fieldC') )
        ModelB.objects.update_or_create(user=self.request.user, fieldC=fieldC_req)

        serializer.save(owner=self.request.user)

serializers.py

class ModelA_Serializer(serializers.ModelSerializer):
    class Meta:
        model = ModelA

2 个答案:

答案 0 :(得分:1)

Django信号post_save()将基本上复制您的数据

嗯,首先,您建议使用Django post_save信号,该信号基本上会将Model1.field的值复制到Model2.field(因为调用了post_save每个保存)。

如果这就是您想要的效果,如果您将该字段存储在单个“共享”模型中,您不需要重复数据就可以了得更好,您可以遇到这样的不一致,加上它只会浪费CPU和存储资源。

REST端点不一定与(单个)模型

相关联

要使端点设计得很好,它不必在单个模型上工作 甚至是这个问题的模型。

如果您的业务逻辑需要访问多个模型,那么在update_or_create中支持POST请求的2个模型上使用perform_create()没有问题

答案 1 :(得分:1)

我认为你可以在序列化程序中使用def create function来做到这一点。

def create(self, validated_data):
    modelB = ModelB.objects.create(**validated_data)
    return ModelA.objects.create(**validated_data)

披露:我以前从未尝试过这个。

了解详情:http://www.django-rest-framework.org/tutorial/1-serialization/

如果有效,请发表评论。