Логика для сортируемой таблицы с помощью перетаскивания в Django

Я пытаюсь создать функцию для сортируемой таблицы. обновляю позиции идентификаторов в соответствии с заданным запросом:

def put(self, request):
    max_len = Device.objects.count()
    ids = int(request.query_params.get('id'))
    temp = ids
    old = int(request.query_params.get('old'))
    new = int(request.query_params.get('new'))

    if new == old:
        return Response("both are equal can't go ahead")

    elif new > max_len:
        return Response("Invalid Position")

    elif old < new:
        t = Device.objects.get(id=ids)
        t.position = 0
        print("new position Updated to 0")
        t.save()

        for i in range(old + 1, new + 1, 1):
            ids = ids + 1
            print(ids)
            t = Device.objects.get(id=ids)
            print(t)
            t.position = t.position - 1
            print(t.position)
            t.save()
            print(i, "value saved")
        t = Device.objects.get(id=temp)
        t.position = new
        print("new position Updated with ", t.position)
        t.save()
        print("new position saved")
        return Response("old < New")

    elif old > new:
        t = Device.objects.get(id=ids)
        t.position = 0
        print("new position Updated to 0")
        t.save()

        for i in range(old - 1, new - 1, -1):
            ids = ids - 1
            print(ids)
            t = Device.objects.get(id=ids)
            print(t)
            t.position = t.position + 1
            print(t.position)
            t.save()
            print(i, "value saved")
        t = Device.objects.get(id=temp)
        t.position = new
        print("new position Updated with ", t.position)
        t.save()
        print("new position saved")
        return Response("old > New")

Нужна помощь, чтобы сделать его более эффективным, в настоящее время после двух или трех раз значение позиций начинает быть избыточным, пожалуйста, проведите тест и предложите мне способ сделать это.

Как я уже упоминал в своем комментарии, я думаю, что такой подход может привести к некоторым ошибкам, поэтому я бы предложил вам немного изменить ваш запрос.

Может быть, сделать вычисления на передней стороне, а затем послать объект с новыми позициями и идентификаторами, а затем обработать его?

тело запроса может выглядеть следующим образом

[
  {
    "id":1,
    "position":2,
  },
  {
    "id":2,
    "position":3,
  }, ... ,
  {
    "id":10,
    "position":1,
  }
]

и затем вы можете итерировать этот список и назначить каждое устройство на его новую позицию

for item in request.data:
    d = Device.objects.get(item['id'])
    d.position = item['position']
    d.save()

Возможно, вы захотите переосмыслить это, так как состояние на стороне сервера может не соответствовать клиенту, когда несколько клиентов используют это. (т.е. устройство в "позиции 2" меняется в зависимости от того, какие запросы пришли раньше)

Один из способов - всегда отправлять полный список идентификаторов устройств и перенумеровывать позиции в соответствии с этим списком.

Другой способ - изменить положение относительно других устройств. Так, отправьте запрос "поместить устройство id=3 после устройства id=5", а затем переместите все устройства соответствующим образом (и, возможно, ответьте обновленным списком для обновления клиентской части).

Вернуться на верх