Существует ли эффективный алгоритм обновления упорядоченных данных в 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()

Получение существующих объектов маршрута: Получение всех существующих объектов маршрута из базы данных.

Обновить порядок: Обновить порядок объектов маршрута в соответствии с данными пользователя.

Обработка добавлений и удалений: Обработка любых добавлений и удалений отдельно, не затрагивая мемо-данные существующих объектов.

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