Serialization 将列表发布到API,根据实例的存在进行更新或创建
我有一个视图,它允许我将多个条目发布到一个模型。当前,如果我添加所有新条目,它们将成功添加。但是如果我添加任何pk已经存在的条目,它自然会抛出一个序列化程序错误,并且不会更新任何内容 我希望写一个方法,它可以让我发布多个条目,但根据实例的存在,自动更新现有条目或成功添加新条目 定制ListSerializer的想法是我遇到的最接近实现这一点的想法,但仍然不清楚我是否能够做到这一点 有人实现过类似的东西吗 在views.py中:Serialization 将列表发布到API,根据实例的存在进行更新或创建,serialization,django-rest-framework,Serialization,Django Rest Framework,我有一个视图,它允许我将多个条目发布到一个模型。当前,如果我添加所有新条目,它们将成功添加。但是如果我添加任何pk已经存在的条目,它自然会抛出一个序列化程序错误,并且不会更新任何内容 我希望写一个方法,它可以让我发布多个条目,但根据实例的存在,自动更新现有条目或成功添加新条目 定制ListSerializer的想法是我遇到的最接近实现这一点的想法,但仍然不清楚我是否能够做到这一点 有人实现过类似的东西吗 在views.py中: def post(self,request,format=None)
def post(self,request,format=None):
data = JSONParser().parse(request)
serializer = PanelSerializer(data=data,many=True)
if serializer.is_valid():
serializer.save()
return JsonResponse({"success":"true","content":serializer.data}, status=201)
return JsonResponse({'success': "false",'errorCode':"1",'errorMessage':serializer.errors}, status=400)
在serializers.py中:
class PanelSerializer(serializers.ModelSerializer):
class Meta:
model = Panel
fields = ('pId','pGuid','pName', 'pVoltage', 'pAmperage','pPermission', 'pPresent', 'pSelf','pInfo')
def create(self, validated_data):
logger.info('Information incoming_1!')
print ("Atom")
return Panel.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.pId = validated_data.get('pId', instance.pId)
instance.pGuid = validated_data.get('pId', instance.pGuid)
instance.pName = validated_data.get('pName', instance.pName)
instance.pVoltage = validated_data.get('pVoltage', instance.pVoltage)
instance.pAmperage = validated_data.get('pAmperage', instance.pAmperage)
instance.pPermission = validated_data.get('pPermission', instance.pPermission)
instance.pPresent = validated_data.get('pPresent', instance.pPresent)
instance.pSelf = validated_data.get('pSelf', instance.pSelf)
instance.pInfo = validated_data.get('pInfo', instance.pInfo)
instance.save()
return instance
到目前为止,代码就是这样的。我相信我主要需要处理序列化程序的更新方法,或者首先将其更改为ListSerializer,然后在更新方法中再次编写一些自定义逻辑 更准确地说,在通过修改上述代码尝试了我想要的内容之后,我得到了以下错误:默认情况下,many=True的序列化程序不支持多个更新,只支持多个create。对于更新,不清楚如何处理插入和删除。如果需要支持多个更新,请使用
ListSerializer
类并重写.update()
,以便准确指定行为。因此,为了更加清晰,我希望看到上面描述的实现。这种方法与REST完全无关。因此,rest框架对于这个任务来说是一个糟糕的选择。使用一些序列化程序库并创建普通的django视图更容易。或者,您可以选择在保存时发出2个请求。发布新记录,发布/修补现有记录。好的,我会尝试改变我的方法,除非我在某处看到一个正在运行的示例。谢谢你的回复!我尝试实现ListSerializer方法,但我不完全理解它,只是查看文档中给出的示例。更准确地说,在通过修改上述代码尝试了我想要的方法之后,我得到了以下错误:默认情况下,many=True的序列化器不支持多个更新,只支持多个创建。对于更新,不清楚如何处理插入和删除。如果需要支持多个更新,请使用ListSerializer
类并重写.update()
,以便准确指定行为。因此,为了更加清晰,我希望看到上面描述的实现。这种方法与REST完全无关。因此,rest框架对于这个任务来说是一个糟糕的选择。使用一些序列化程序库并创建普通的django视图更容易。或者,您可以选择在保存时发出2个请求。发布新记录,发布/修补现有记录。好的,我会尝试改变我的方法,除非我在某处看到一个正在运行的示例。谢谢你的回复!我尝试实现ListSerializer方法,但我不完全理解它,只是查看文档中给出的示例。