Как получать одинаковые индексы и менять их местами?

Всем привет. Кратко о проекте: 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 шт):

Автор решения: Michael Tetelev

сделать так, чтобы индексы не повторялись - поставить 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. Также изначально не должно быть одинаковых индексов, существующие ошибки функция не правит.

→ Ссылка