Serialization 将列表发布到API,根据实例的存在进行更新或创建

Serialization 将列表发布到API,根据实例的存在进行更新或创建,serialization,django-rest-framework,Serialization,Django Rest Framework,我有一个视图,它允许我将多个条目发布到一个模型。当前,如果我添加所有新条目,它们将成功添加。但是如果我添加任何pk已经存在的条目,它自然会抛出一个序列化程序错误,并且不会更新任何内容 我希望写一个方法,它可以让我发布多个条目,但根据实例的存在,自动更新现有条目或成功添加新条目 定制ListSerializer的想法是我遇到的最接近实现这一点的想法,但仍然不清楚我是否能够做到这一点 有人实现过类似的东西吗 在views.py中: def post(self,request,format=None)

我有一个视图,它允许我将多个条目发布到一个模型。当前,如果我添加所有新条目,它们将成功添加。但是如果我添加任何pk已经存在的条目,它自然会抛出一个序列化程序错误,并且不会更新任何内容

我希望写一个方法,它可以让我发布多个条目,但根据实例的存在,自动更新现有条目或成功添加新条目

定制ListSerializer的想法是我遇到的最接近实现这一点的想法,但仍然不清楚我是否能够做到这一点

有人实现过类似的东西吗

在views.py中:

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方法,但我不完全理解它,只是查看文档中给出的示例。