DRF中有没有高效的更新有序数据的算法?

问题描述 投票:0回答:1

我在更新有序数据的算法上遇到问题。

例如,我有一个模型,名为

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

起初,我认为我可以删除所有这些现有数据并重新创建传入数据。 (我知道这确实效率低下,但我决定这样做。)

但是我在未添加或删除的数据中保留备忘录数据时遇到问题。

我该怎么办?

django algorithm django-rest-framework backend
1个回答
0
投票

以下是如何实现这一点的基本概述:

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()

检索现有的Route对象:从数据库中获取所有现有的Route对象。

更新顺序:根据用户的输入更新Route对象的顺序。

处理添加和删除:单独处理任何添加或删除,不影响现有对象的备忘录数据。

© www.soinside.com 2019 - 2024. All rights reserved.