Логика для сортируемой таблицы с помощью перетаскивания в 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", а затем переместите все устройства соответствующим образом (и, возможно, ответьте обновленным списком для обновления клиентской части).