如何在django rest框架中更新多个对象?

如何在django rest框架中更新多个对象?,django,django-rest-framework,django-views,django-serializer,Django,Django Rest Framework,Django Views,Django Serializer,我尝试使用ID更新多个对象,我将ID传递给每个需要更新但找不到任何成功方法的对象。这是我的密码 models.py class EventTicket(models.Model): id = models.UUIDField(primary_key=True, default=uuid_generate_v1mc, editable=False) name = models.CharField(max_length=250) description = models.Te

我尝试使用ID更新多个对象,我将ID传递给每个需要更新但找不到任何成功方法的对象。这是我的密码

models.py

class EventTicket(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid_generate_v1mc, editable=False)
    name = models.CharField(max_length=250)
    description = models.TextField(max_length=1000)
views.py

  class EventTicketView(APIView, PaginationHandlerMixin):
        permission_classes = (AllowAny,)
        def get_object(self, ticket_id):
            try:
                return EventTicket.objects.get(id=ticket_id)
            except EventTicket.DoesNotExist():
                raise status.HTTP_400_BAD_REQUEST
        def patch(self, request, *args, **kwargs):
            for each_ticket in request.data:

                ticket_id = self.get_object(each_ticket['ticket_id'])

                serializer = EventTicketSerializer(instance=ticket_id,data=request.data,partial=True)
                if serializer.is_valid():
                    serializer.save()
                    result = {
                        'message': "updated sucessfully"
                    }
                    return Response(result, status=status.HTTP_201_CREATED)
                else:
                    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
序列化程序.py

class EventTicketSerializer(serializers.ModelSerializer):
    class Meta:
        model = EventTicket
        fields = ['name', 'description']
```

I have to send data like list of multiple objects :::
[
    {
    "ticket_id": "054665ea-4fde-11ea-94b2-9f415c43ba4c",    
    "name": "chris",
    "description":"The golden ticket for day only",

    },
    {   
    "ticket_id": "054656ea-4fde-11ea-94b2-9f415c43ba4c",
    "name": "daut",
    "description":"The premium ticket for day only",

    }
]

下面的代码将使您正确理解在一个请求中更新多个对象。 对于在单个请求中更新多个对象,最好使用PUT方法而不是PATCH。 这里给出了人体数据

身体数据

{
    "ids":[
        "5e41770d2e8fa013d1f034ec",
        "5e41772c2e8fa013d1f034ee",
        "5e4177702e8fa013d1f034f2",
        "5e453f302e8fa075aa18b277",
        "5e4a314f2e8fa070c5251a0a"
    ]
}
我正在将DemoConfig模型的给定ID的enabled属性从False更新为True。 同样,您可以更新数据。根据您的需求,您可以编写验证方法来验证主体数据。 序列化程序已写入以序列化响应的实例数据

类DemoApiView: def get_对象自身,对象id: 尝试: 返回DemoConfig.objects.getid=obj_id 除DemoConfig.DoesNotExist外,ValidationError: raise status.HTTP\u 400\u错误\u请求 def验证id自身,id列表: 对于id_列表中的id: 尝试: DemoConfig.objects.getid=id 除DemoConfig.DoesNotExist外,ValidationError: raise status.HTTP\u 400\u错误\u请求 返回真值 def putself,请求,*args,**kwargs: id\u list=request.data['id'] self.validate\u idsid\u list=id\u list 实例=[] 对于id_列表中的id: obj=self.get\u objectobj\u id=id obj.enabled=True 对象保存 instances.appendobj serializer=DemoSerializerinstances,many=True 返回响应Serializer.data 此视图的Serialiser是:

类DemoSerializerDocumentSerializer: 类元: model=DemoConfig 字段='\uuuu所有\uuuu' 输出:

{
  "data": [
    {
      "id": "5e41770d2e8fa013d1f034ec",
      "name": "CONFIG_1",
      "enabled": true,

    },
    {
      "id": "5e41772c2e8fa013d1f034ee",
      "name": "CONFIG_2",
      "enabled": true,

    },
    {
      "id": "5e4177702e8fa013d1f034f2",
      "name": "CONFIG_3",
      "enabled": true,

    },
    {
      "id": "5e453f302e8fa075aa18b277",
      "name": "CONFIG_4",
      "enabled": true,

    },
    {
      "id": "5e4a314f2e8fa070c5251a0a",
      "name": "CONFIG_5",
      "enabled": true,

    }
  ]
}
根据您的代码要求,您需要以以下方式使用put方法

def putself,请求,*args,**kwargs: data=request.data 票证id=[i['ticket\u id']代表数据中的i] self.validate\u id票证\u id 实例=[] 对于临时输入数据: 票证id=临时票证['票证id'] 名称=临时记录['name'] description=temp_dict['description'] obj=self.get\u objectticket\u id obj.name=名称 obj.description=描述 对象保存 instances.appendobj serializer=DemoSerializerinstances,many=True 返回响应Serializer.data
下面的代码将使您正确理解在一个请求中更新多个对象。 对于在单个请求中更新多个对象,最好使用PUT方法而不是PATCH。 这里给出了人体数据

身体数据

{
    "ids":[
        "5e41770d2e8fa013d1f034ec",
        "5e41772c2e8fa013d1f034ee",
        "5e4177702e8fa013d1f034f2",
        "5e453f302e8fa075aa18b277",
        "5e4a314f2e8fa070c5251a0a"
    ]
}
我正在将DemoConfig模型的给定ID的enabled属性从False更新为True。 同样,您可以更新数据。根据您的需求,您可以编写验证方法来验证主体数据。 序列化程序已写入以序列化响应的实例数据

类DemoApiView: def get_对象自身,对象id: 尝试: 返回DemoConfig.objects.getid=obj_id 除DemoConfig.DoesNotExist外,ValidationError: raise status.HTTP\u 400\u错误\u请求 def验证id自身,id列表: 对于id_列表中的id: 尝试: DemoConfig.objects.getid=id 除DemoConfig.DoesNotExist外,ValidationError: raise status.HTTP\u 400\u错误\u请求 返回真值 def putself,请求,*args,**kwargs: id\u list=request.data['id'] self.validate\u idsid\u list=id\u list 实例=[] 对于id_列表中的id: obj=self.get\u objectobj\u id=id obj.enabled=True 对象保存 instances.appendobj serializer=DemoSerializerinstances,many=True 返回响应Serializer.data 此视图的Serialiser是:

类DemoSerializerDocumentSerializer: 类元: model=DemoConfig 字段='\uuuu所有\uuuu' 输出:

{
  "data": [
    {
      "id": "5e41770d2e8fa013d1f034ec",
      "name": "CONFIG_1",
      "enabled": true,

    },
    {
      "id": "5e41772c2e8fa013d1f034ee",
      "name": "CONFIG_2",
      "enabled": true,

    },
    {
      "id": "5e4177702e8fa013d1f034f2",
      "name": "CONFIG_3",
      "enabled": true,

    },
    {
      "id": "5e453f302e8fa075aa18b277",
      "name": "CONFIG_4",
      "enabled": true,

    },
    {
      "id": "5e4a314f2e8fa070c5251a0a",
      "name": "CONFIG_5",
      "enabled": true,

    }
  ]
}
根据您的代码要求,您需要以以下方式使用put方法

def putself,请求,*args,**kwargs: data=request.data 票证id=[i['ticket\u id']代表数据中的i] self.validate\u id票证\u id 实例=[] 对于临时输入数据: 票证id=临时票证['票证id'] 名称=临时记录['name'] description=temp_dict['description'] obj=self.get\u objectticket\u id obj.name=名称 obj.description=描述 对象保存 instances.appendobj serializer=DemoSerializerinstances,many=True 返回响应Serializer.data
那么您得到的是什么错误?错误是:{non_field_errors:[无效数据。需要一个字典,但得到了列表。]}然后是什么错误
你得到的?错误是:{non_field_errors:[无效数据。需要字典,但得到列表。]}我正在发送身体数据,就像对象列表一样,[{票证id:054665ea-4fde-11ea-94b2-9f415c43ba4c,名称:chris,描述:仅限一天的金票,},{票证号:054656ea-4fde-11ea-94b2-9f415c43ba4c,姓名:daut,描述:仅限当天的特价票,}]因此,使用上述方法会抛出此错误::列表索引必须是整数或片,而不是str。此外,我必须在数据体中传递名称和描述以更新更新,我们可以做什么修改?在您的示例中,使用``DATA=request.DATA ticket\u id=[i['ticket\u id']表示数据中的i]self.validate\u idsticket\u数据中临时dict的id:ticket\u id=temp\u dict['ticket\u id']name=temp\u dict['name']description=temp\u dict['description']obj=self.get\u objectticket\u id````@suresh根据主体数据检查编辑的解决方案。数据的验证由您决定……但其标准做法是在更新实例之前验证主体数据。非常感谢,工作正常,我在验证过程中犯了一些错误。我正在发送主体数据,就像对象列表一样,[{票证号:054665ea-4fde-11ea-94b2-9f415c43ba4c,姓名:克里斯,描述:仅限当天的金票,},{票证号:054656ea-4fde-11ea-94b2-9f415c43ba4c,姓名:daut,描述:仅限当天的特价票,}]因此,使用上述方法会抛出此错误::列表索引必须是整数或片,而不是str。此外,我必须在数据体中传递名称和描述以更新更新,我们可以做什么修改?在您的示例中,使用``DATA=request.DATA ticket\u id=[i['ticket\u id']表示数据中的i]self.validate\u idsticket\u数据中临时dict的id:ticket\u id=temp\u dict['ticket\u id']name=temp\u dict['name']description=temp\u dict['description']obj=self.get\u objectticket\u id````@suresh根据主体数据检查已编辑的解决方案。数据的验证取决于您……但其标准做法是在更新实例之前验证主体数据。非常感谢,工作正常,我在验证过程中犯了一些错误。