用于用户可修改的自定义排序的Django模型字段

时间:2016-04-12 17:34:28

标签: django

我有一个Django应用程序,用户可以对表中的值进行重新排序,并且可以添加新值并删除旧值。

什么是"权利"这样做的方法?

我可以定义order = models.IntegerField()

然后将每行设置为正确的值,以便创建用户定义的正确自定义顺序。但这有一个主要的缺点,即每次重新订购都需要在更新后的每一行都使用新的order进行更新。我可以使代码变得更聪明,并将选择的Integer定义为前一个和下一个之间的中间位置 - 但这仍然意味着偶尔会出现冲突并且所有行都必须更新。

一种可能的解决方案是使用浮子。然后插入行的顺序总是在前一行和下一行的中间...使用浮点数进行排序是否存在任何问题(特别是如果行数非常高)。

是否有更好/更智能/更内置的方式来处理这样的事情?

1 个答案:

答案 0 :(得分:2)

我很想听到更聪明的解决方案,但我怀疑有什么比整数顺序字段更简单,这就是我一直在使用的。

为避免价值冲突,您不需要让用户直接自定义此值,而是根据某种排序GUI(拖放等)在幕后自动执行。

工作流程类似于:向用户显示列表,让他们按需要重新排列,按顺序提交整个列表并更新每个记录的排序,从1开始,然后输入+1。

如果您希望用户偶尔交换一对项目,或者在中间插入新项目,那么您可以使用UPDATE查询更新订单,而无需手动循环列表(UPDATE table set orderid = orderid + 1 where orderid >= :position以插入新的在某个位置的项目等)。

您不应该在该列表中有太多条目来担心数据库更新性能,因为用户需要以某种方式手动对项目进行排序,您不能给他们一百万条记录进行排序。如果是这种情况,那么您可能需要做一些额外的事情,以便用户订购的商品数量是可管理的。