我在更新有序数据的算法上遇到问题。
例如,我有一个模型,名为
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()
检索现有的Route对象:从数据库中获取所有现有的Route对象。
更新顺序:根据用户的输入更新Route对象的顺序。
处理添加和删除:单独处理任何添加或删除,不影响现有对象的备忘录数据。