Существует ли эффективный алгоритм обновления упорядоченных данных в DRF?
У меня возникла проблема с алгоритмом, который обновляет упорядоченные данные.
Например, у меня есть одна модель под названием Route
.
class Route(models.Model):
order = models.IntegerField(null=False, blank=False)
memo = models.CharField(max_length=400, null=True, blank=True)
У меня есть Route
упорядоченные данные, такие как... (не вписывается в грамматику)
(id:1, order:1, memo:"aaa")->(id:2, order:2, memo:"bbb")->(id:3, order:3, memo:"ccc")
И пользователь может изменять, удалять, добавлять в заказ в одной конечной точке, например...
(order:3)->(order:1)->(order:2) # change order
(order:1)->(order:3) # delete elements (order:2)
(order:1)->(order:2)->(order:3)->(order:4) # add elements
Сначала я подумал, что могу удалить все эти существующие данные и заново создать входящие. (Я знаю, что это очень неэффективно, но я решил поступить именно так.)
Но у меня есть проблема с сохранением данных мемо среди данных, которые не были добавлены или удалены.
Что мне делать?
Вот основная схема того, как это можно реализовать:
from django.db import transaction
def update_route_order(route_updates):
# Start a database transaction
with transaction.atomic():
# Step 1: Retrieve existing Route objects
existing_routes = Route.objects.all().order_by('order')
# Step 2: Update the order
for route_id, new_order in route_updates:
route = existing_routes.get(id=route_id)
route.order = new_order
route.save()
# Step 3: Handle additions and deletions
existing_route_ids = set(route.id for route in existing_routes)
updated_route_ids = set(route_id for route_id, _ in route_updates)
deleted_route_ids = existing_route_ids - updated_route_ids
added_route_ids = updated_route_ids - existing_route_ids
# Delete routes that are no longer present
Route.objects.filter(id__in=deleted_route_ids).delete()
# Create new routes for added items, preserving memo data
for route_id in added_route_ids:
original_route = Route.objects.get(id=route_id)
new_route = Route.objects.create(order=original_route.order, memo=original_route.memo)
# Optionally update other fields if needed
# Commit the transaction
transaction.commit()
Получение существующих объектов маршрута: Получение всех существующих объектов маршрута из базы данных.
Обновить порядок: Обновить порядок объектов маршрута в соответствии с данными пользователя.
Обработка добавлений и удалений: Обработка любых добавлений и удалений отдельно, не затрагивая мемо-данные существующих объектов.