如何在Django中更新现有记录?

问题描述 投票:0回答:1

我正在尝试更新Django中的现有记录,但是每当我向邮递员提出请求时,都会得到以下内容。

Postman Request

它说它已经存在。所以我试图分配

task_1 = Task.objects.get(pk=task_id)
task_1 = ser

但是我收到一个我无法分配的错误

==============================

我当前的代码:

models.py and urls.py

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

所以,如何从请求正文中更新给定的密钥。

django django-rest-framework django-serializer
1个回答
0
投票

所以解决方案非常简单。

我只需要在保存功能内添加一些参数=> 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)

© www.soinside.com 2019 - 2024. All rights reserved.