Как обновить существующую запись в Django? - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь обновить существующую запись в 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

Так как мне просто обновить данные ключи из тела запроса?

1 Ответ

0 голосов
/ 10 января 2020

Итак, решение было довольно простым.

Мне просто нужно было добавить несколько аргументов в функцию сохранения => 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)

...