Как сделать bulk_updates в Django с помощью Queryset

Здесь я пытаюсь сделать массовые обновления в Django:

Проблема: В модели есть столбец имя позиции, чье значение меняется в зависимости от перетаскивания позиции записи. поэтому я создаю Queryset для этого, но не получаю требуемого результата, я я могу обновить значение конкретного идентификатора, который был перетащен, но в соответствии с этим необходимость дальнейшего обновления становится немного сложной при использовании Queryset.

Пример:

id name position
 1 anil    1
 2 ABC     2
 3 XYZ     3
 4 def     4

теперь если я перетащу id 1 на 4 место, то мне нужно сдвинуть else на позицию - 1, Например:

id name position
 2 ABC     1
 3 XYZ     2
 4 def     3
 1 anil    4

для этого я использовал Queryset bulk_update, но не получил никакого правильного способа сделать это, пожалуйста, дайте мне знать лучший способ сделать обновление позиций. возможно, я слишком длинно изложил вопрос, но я разместил этот запрос трижды, в надежде, что теперь я получу требуемый результат.

Заранее спасибо

Я бы предложил использовать функциональность F из Django для обновления всех объектов в наборе запросов с помощью правила арифметических значений

Что-то вроде:

Model.objects.filter(…).update(order=F('order') - 1)

https://docs.djangoproject.com/en/4.0/ref/models/expressions/

from django.db.models import Case, When, F

from_position = 1
to_position = 4

# First update the row we are moving to have a position of -1
Orderable.objects.filter(position=from_position).update(position=-1)

# Then update all objects in between the from/to positions either up or down
# depending of if the row is moving up or down
Orderable.objects.filter(
    position__range=sorted([from_position, to_position])
).update(
    position=Case(
        When(position__range=(from_position, to_position), then=F('position') - 1),
        When(position__range=(to_position, from_position), then=F('position') + 1),
    )
)

# Then update the position of the original row
Orderable.objects.filter(position=-1).update(position=to_position)

Документы для условных выражений

Вернуться на верх