This would allow you to move a book to any position
class Book(models.Model):
...
def move(self, new_position):
current_position = self.position
# No move
if current_position == new_position:
return
# Move book "left" (to a lower position number)
elif current_position > new_position: # 4 -> 2
move = 1
start = new_position # 2
end = current_position # 4
#Move book "right" (to a higher position number)
else: # 2 -> 4
move = -1
start = current_position # 2
end = new_position # 4
Books.objects.filter(
shelf=self.shelf,
position__gte=start,
position__lte=end,
).exclude(
pk=self.pk # Move this manually
).update(
position=F('position') + move
)
self.position = new_position
self.save()