Как сделать 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)