我想创建一个模型,以适当的方式对其子模型进行排序。例如,一本书有很多章节,但章节必须按特定的顺序排列。
我假设我需要在章节模型上放置一个IntegerField来指定章节的顺序,如下面的问题所示:Ordered lists in django
我的主要问题是,每当我想在两个现有章节之间插入一个新章节或以任何方式重新排序时,我都必须更新(几乎)书中的每一章。有没有办法(也许在我正在使用的Django Admin中)避免每当我更改订单时都必须手动更改每个章节的每个索引?
我不喜欢创建一个“链表”样式模型,就像上面链接的问题所提出的那样,因为我认为这不是数据库创建的好习惯。
建立这种关系的“正确”方法是什么?
答案 0 :(得分:2)
使用float而不是整数来避免在插入两个项目时更新多个项目的问题。
因此,如果你想在第42项和第43项之间插入一个项目,你可以在两者之间(42.5)给它一个订单值,你不必更新任何其他项目。
在x和y之间插入z ... z.order =(y.order - x.order)/ 2 + x.order
答案 1 :(得分:2)
您提到的答案可能是有效处理此问题的最佳方法。可能需要原始SQL语句UPDATE Chapter SET order = order + 1 WHERE book_id = <id_for_book> AND order <= <insert_index_location>
。 对于Django 1.1 + :你可以使用F()
将其写在一行中,如下所示,但它可能仍然是使用事务处理的O(n)查询。
Book.objects.get(id=<id_of_book>).chapter_set.filter(order__gt=<place_to_insert>).update(order=F('order')+1)