我有一个Django应用,其中用户可以对表中的值进行重新排序,可以添加新值,也可以删除旧值。
这样做的“正确”方法是什么?
我可以定义 order = models.IntegerField()
然后将每一行的值设置为正确的值,以创建用户定义的正确的自定义排序。但是,这样做的主要缺点是,每次更改后都需要用新的更新来更新每一行order
。我可以使代码更加智能,并定义选择为前一个和下一个之间的中间值的Integer,但这仍然意味着偶尔会有冲突,并且所有行都必须更新。
一种可能的解决方案是使用浮点数。然后,插入行的顺序始终可以位于上一个和下一个之间的中间...使用浮点数进行排序是否有任何可能的问题(特别是如果行数变得很高的话)。
是否有更好/更智能/更多内置的方式来处理此类问题?
我很想听听其他更聪明的解决方案,但我怀疑有没有什么比整数阶字段更简单的了,这就是我一直在使用的。
为避免价值冲突,您不必让用户直接自定义此值,而应根据某种排序GUI(拖放等)在后台自动进行此设置。
工作流程将类似于:向用户显示列表,让他们按自己的意愿重新排列,按顺序提交整个列表,并更新每条记录的顺序,从1开始到+1。
如果您希望用户仅偶尔交换一对商品或在中间插入新商品,则可以使用UPDATE查询更新订单,而无需手动遍历列表(UPDATE table set orderid = orderid + 1 where orderid >= :position
在特定位置插入新商品,等等) 。
该列表中的条目不应该太多,不必担心数据库更新性能,因为期望用户以某种方式手动对项目进行排序,因此不能给他们提供一百万条记录来进行排序。如果是这种情况,那么您可能需要做一些额外的事情,以便用户订购的商品数量是可管理的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句