如何在django rest框架中更新多个对象?
我尝试使用ID更新多个对象,我将ID传递给每个需要更新但找不到任何成功方法的对象。这是我的密码 models.py如何在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
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根据主体数据检查已编辑的解决方案。数据的验证取决于您……但其标准做法是在更新实例之前验证主体数据。非常感谢,工作正常,我在验证过程中犯了一些错误。