我有一个问题的算法更新有序数据.

例如,我有一个叫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()

Retrieve the existing Route objects:从数据库中提取所有现有的Route对象.

Update the order:根据用户的输入更新Route对象的顺序.

Handle additions and deletions:单独处理任何添加或删除,而不影响现有对象的备注数据.

Django相关问答推荐

使用django直接计算geohash而不创建模型

Django中的登录重定向

在Django管理中仅显示外键的特定值

Django REST序列化程序TO_REATION失败

为什么 Django 在错误的目录中寻找模板?

如何组织 Django REST Framework url

Django 相当于子查询

如何在视图中的 Django 重定向末尾附加字符串?

Django PositiveIntegerField 中的 0 值?

django 用一个提交按钮提交两种不同的表单

Django UrlResolver,在运行时添加 url 进行测试

在 Django 中使用 AuthenticationForm

使用 Django 1.5 实现多种用户类型

Python Django 模板和测试变量是否为空或空字符串

django 管理列表中的外键显示

Django unique=True 不工作

将 Django Rest Framework 与序列化程序一起使用时出现 AttributeError

django - 使用 get_or_create 自动创建用户时设置用户权限

想要在 Django 测试中禁用信号

django/文件上传权限