Сам недавно с такой же примерно задачей столкнулся, правда в Питоне. Храню позицию в базе, а при смене позиции "сдвигаю" нужные элементы, чтобы нужные позиции перестраивались. Возможно, Вам пригодится:
touched_question = TestQuestion.objects.get(id=kwargs['question_id'])
questions = TestQuestion.objects.filter(test_id=touched_question.test_id)
for question in questions:
if question.id != kwargs['question_id']:
if touched_question.number < question.number <= new_number: # Сдвиг вправо
question.number -= 1
question.save()
if new_number <= question.number < touched_question.number: # Сдвиг влево
question.number += 1
question.save()
touched_question.number = new_number
touched_question.save()
Правда в моем случае данных мало, а в Вашем это решение, возможно, не будет оптимальным. Потому что тут запросы в цикле))