我正在创建的应用向用户显示所有模型实例的项目列表。我希望他们能够使用JQuery的sortable()方法对项目进行排序。这是实现并正常工作,但我需要一种方法来保存它们的列出顺序。此列表会更频繁地更新,项目将被删除并添加新项目。
我最初的方法是给模型一个“位置”列,每次在列表中移动一个列表项时,更改列表中所有项的位置值。但是,这需要我每次对1进行排序时获取所有模型对象,并对每个模型对象进行更改。
我能想出的另一种方法是给每个人一个“重量”值,而不是他们的实际列表位置。在每个值之间留出足够的空间以填补空白。例如,权重是10,20,30和10。 40.如果用户将第四个项目移动到第二个位置,请查看第一个和第二个项目,然后选择15作为其权重。当然,只有在为了放置物品而必须重新计算所有重量之前,这才会有效。
我是否过度思考这个?我不希望这个应用程序的高使用率,所以使用位置列的额外模型调用不会真的成为问题 - 但如果有更好,更有效的方法来做到这一点,我会仍然喜欢这样做。
谢谢: - )
答案 0 :(得分:1)
如果必须将其保存的时间晚于向模型添加权重或订单字段,然后将逻辑放入以在重写的保存方法中处理更改的权重。 http://docs.djangoproject.com/en/dev/ref/models/instances/#saving-objects http://stackoverflow.com/questions/817284/overriding-the-save-method-in-django-modelform
然后您可以在查询集中使用order by http://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by
答案 1 :(得分:1)
现在你让我过度思考这个! :)
您可以采用链表样式方法。在字段之前和之后给出您的模型(上一个,下一个,无论您想要什么称呼它们)。你仍然需要你的权重字段进行排序,但我认为你可以使用字符字段按字典顺序排序。
因此,添加新条目意味着标准链接列表插入:
此外,您需要为新字段选择一个重量。像之前条目的重量一样附加“.1”,这将很好。
删除和重新排序类似。
然后你需要一个cron工作来不时地清理你的重量。
这会减少您在插入和重新排序时仅点击几个模型...
编辑:实际上,你可能甚至不需要上一个和下一个字段 - 词典编纂方法也可以正常工作 - 但这并没有考虑到它太难......我想我已经想得太多了关于这个;)
答案 2 :(得分:0)
我会在浏览器中跟踪排序顺序,并在每次对表进行排序时对服务器进行ajax调用,将排序顺序保存到会话变量中。 (http://docs.djangoproject.com/en/dev/topics/http/sessions/)