Как получать одинаковые индексы и менять их местами?
Всем привет. Кратко о проекте: Django-проект, есть элементы Item при добавлении каждого нового - создаётся order_index по порядку (+1 от общего числа), для сортировки. Реализованы 2 функции: up_item которая прибавлеят +1 к order_index, и down_item которая отнимает -1 от order_index.
Проблема: Совпадение индексов order_item. Может получится несколько индексов, например, со значением 2.
Функция выглядит так:
def up_item(request, id):
item = Item.objects.get(id=id)
item.order_index +=1
item.save()
return redirect('/')
Нужно: сделать так, чтобы индексы не повторялись (при добавлении +1, отнимался -1 у другого). Чтоб при функции up_item прибавлялся +1 к order_index и отнимался -1 у order_index другого item с таким же значением индекса. И при down_item отнимался -1, но прибавлялся +1 у item с таким же индексом order_index.
Например: item_bb имеет индекс 1, а item_cc имеет индекс 2. При нажатии на функцию up_item - у обоих получится одинаковые индексы 2, и это проблема! Нужно чтоб функция не только прибавляля +1 у item_bb, но и отнимала -1 у item_cc!
Ответы (1 шт):
сделать так, чтобы индексы не повторялись - поставить unique столбцу :)
менять их местами - что-то такое:
def set_order_index(item: Item, distinction: int) -> None:
items_to_swap = Item.objects.filter(
order_index=item.order_index + distinction
)
if len(items_to_swap) > 0:
item_to_swap = items_to_swap[0]
item_to_swap.order_index = item.order_index
item_to_swap.save()
item.order_index += distinction
item.save()
def up_item(request, id):
item = Item.objects.get(id=id)
set_order_index(item, 1)
return redirect('/')
Для down_item вторым аргументом передавать -1. Также изначально не должно быть одинаковых индексов, существующие ошибки функция не правит.