Django Posts模型存在空序号时如何实现与最近相邻序号上下交换
解决方案
核心修改逻辑如下:
- 上移时(传入+1):筛选所有
order_index大于当前记录的Post,按order_index升序排序后取第一条,即为当前记录上方最近的相邻对象 - 下移时(传入-1):筛选所有
order_index小于当前记录的Post,按order_index降序排序后取第一条,即为当前记录下方最近的相邻对象 - 不存在对应相邻对象时(已经是最顶/最底记录),不执行任何操作
修改后的完整代码:
交换逻辑函数
from django.db import transaction @transaction.atomic def set_order_index(item: Posts, distinction: int): current_index = item.order_index # 查找要交换的相邻对象 if distinction > 0: # 上移:找比当前序号大的最小序号记录 swap_item = Posts.objects.filter(order_index__gt=current_index).order_by('order_index').first() else: # 下移:找比当前序号小的最大序号记录 swap_item = Posts.objects.filter(order_index__lt=current_index).order_by('-order_index').first() # 没有相邻对象直接返回 if not swap_item: return # 交换两个记录的序号 item.order_index, swap_item.order_index = swap_item.order_index, item.order_index item.save() swap_item.save()
视图调用部分
原有调用逻辑无需修改,保持即可:
def up_item(request, id): item = Posts.objects.get(id=id) set_order_index(item, +1) return redirect('index') def down_item(request, id): item = Posts.objects.get(id=id) set_order_index(item, -1) return redirect('index')
补充说明
@transaction.atomic装饰器用于保证交换操作的原子性,避免并发操作或者中途报错导致序号异常- 可以给
order_index字段加上数据库索引,进一步加快筛选排序的查询速度
内容的提问来源于stack exchange,提问作者Elliot13
相关产品推荐
相关产品推荐

