gpt4 book ai didi

python - Django:更新查询集中对象的顺序属性

转载 作者:太空狗 更新时间:2023-10-30 00:00:40 24 4
gpt4 key购买 nike

我在我的模型上有一个属性,允许用户对对象进行排序。我必须根据列表更新元素的顺序,该列表包含新顺序中对象的 id;现在我正在遍历整个查询集并一个接一个地设置对象。对整个查询集执行相同操作的最简单/最快的方法是什么?

def update_ordering(model, order):
""" order is in the form [id,id,id,id] for example: [8,4,5,1,3] """
id_to_order = dict((order[i], i) for i in range(len(order)))
for x in model.objects.all():
x.order = id_to_order[x.id]
x.save()

最佳答案

这不能在一个单一的查询集操作中完成。据我所知,它甚至不能在使用原始 SQL 的一个查询中完成。因此,您将始终需要对每个必须更新的对象进行更新调用。因此,对于您的描述,您和 Collin Anderson 的解决方案似乎都是最佳选择。

但是,您的用例是什么?真的整个列表每次都会改变吗?在大多数情况下,这似乎不太可能。我可以看到一些不同的方法。

你像你说的那样保存了订单字段,但是你为订单列表生成了一个差异:def

update_ordering(model, order):
""" order is in the form [id,id,id,id] for example: [8,4,5,1,3] """
original_order = model.objects.value_list('id', flat=True).order_by('order')
order = filter( lambda x: x[1]!=x[2], zip(xrange(len(order)), order, original_order))
for i in order:
model.objects.filter(id=i[1]).update(order=i[0])

另一种方法(取决于您正在做什么)是在可能的情况下进行部分更新(例如使用 AJAX),而不是更新整个重新排序的集合,只需分别更新每个更新。这通常会增加总负载,但随着时间的推移会分散得更多。例如,将第 5 个元素逐步移动到位置 2,这将引入 3 次交换:(5,4); (4,3); (3,2)。导致 6 次更新,而使用一次性方法只需要 4 次。但随着时间的推移,小型操作会分散开来。

关于python - Django:更新查询集中对象的顺序属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3048171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com