我想从单个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
答案 0 :(得分:1)
嗯,首先,您建议使用Django post_save
信号,该信号基本上会将Model1.field
的值复制到Model2.field
(因为调用了post_save
每个保存)。
如果这就是您想要的效果,如果您将该字段存储在单个“共享”模型中,您不需要重复数据就可以了得更好,您可以遇到这样的不一致,加上它只会浪费CPU和存储资源。
要使端点设计得很好,它不必在单个模型上工作 甚至是这个问题的模型。
如果您的业务逻辑需要访问多个模型,那么在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/
如果有效,请发表评论。