我正在尝试更新Django中的现有记录,但是每当我向邮递员提出请求时,都会得到以下内容。
它说它已经存在。所以我试图分配
task_1 = Task.objects.get(pk=task_id)
task_1 = ser
但是我收到一个我无法分配的错误
==============================
class TaskView(APIView):
permission_classes = (IsAuthenticated,)
def put(self, request, task_id):
task_obj = find_task(request.auth, task_id)
if task_obj:
task = task_obj.data
my_data = json.loads(request.body)
keys = list(my_data.keys())
for key in keys:
task[key] = my_data[key]
ser = TaskSerializer(data=task)
ser.is_valid(raise_exception=True)
ser.save()
return Response(ser.data)
else:
return Response(status=status.HTTP_404_NOT_FOUND)
# Returns the task only if its assigned to current user
def find_task(token, task_id):
u_id = Token.objects.get(key=token).user_id
assign_to = AssignTo.objects.filter(task_id=task_id, user_id=u_id)
if len(assign_to) > 0:
task = Task.objects.get(pk=task_id)
serializer = TaskSerializer(task)
return serializer
else:
return False
我相信它与我使用的方法(POST,PUT,PATCH)无关,因为当我注释掉这部分代码时,它可以完美工作:
# ser = TaskSerializer(data=task)
# print(ser)
# ser.is_valid(raise_exception=True)
# ser.save()
return Response(task)
所以它带有序列化和任务实例
==============================
def put(self, request, task_id):
u_id = Token.objects.get(key=request.auth).user_id
assign_to = AssignTo.objects.filter(task_id=task_id, user_id=u_id)
if len(assign_to) > 0:
task = Task.objects.get(pk=task_id)
my_data = json.loads(request.body)
keys = list(my_data.keys())
for key in keys:
task[key] = my_data[key]
print(task)
return Response(task)
else:
return Response(status=status.HTTP_404_NOT_FOUND)
我从第二版代码中得到的错误是:TypeError: 'Task' object does not support item assignment
所以,如何从请求正文中更新给定的密钥。
所以解决方案非常简单。
我只需要在保存功能内添加一些参数=> task.save(update_fields = keys)
这是我的工作代码:
def put(self, request, task_id):
# task = Task.objects.get(pk=task_id)
# Task is the returned Model value
task = find_task(request.auth, task_id)
if task:
my_data = json.loads(request.body)
keys = list(my_data.keys())
for key in keys:
setattr(task, key, my_data[key])
task.save(update_fields=keys)
ser = TaskSerializer(task)
return Response(ser.data)
else:
return Response(status=status.HTTP_404_NOT_FOUND)