3

我想创建一个模型,以适当的方式对其子模型进行排序。例如,一本书有很多章节,但章节必须按特定顺序排列。

我假设我需要在指定章节顺序的章节模型上放置一个 IntegerField,如下面的问题所示:Ordered lists in django

我的主要问题是,每当我想在两个现有章节之间插入新章节或以任何方式重新排序它们时,我都必须更新(几乎)书中的每一章。有没有办法(也许在我正在使用的 Django Admin 中)避免在我更改顺序时手动更改每个章节的每个索引?

正如上面链接的问题中提出的那样,我不是创建“链接列表”样式模型的忠实粉丝,因为我认为这不是创建数据库的好习惯。

建模这种关系的“正确”方法是什么?

4

2 回答 2

2

使用浮点数而不是整数来避免在两个项目之间插入时更新多个项目的问题。

所以如果你想在项目 42 和项目 43 之间插入一个项目,你可以给它一个介于两者之间的 order 值(42.5),你不必更新任何其他项目。

在 x 和 y 之间插入 z... z.order = (y.order - x.order) / 2 + x.order

于 2012-05-21T17:03:04.140 回答
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)
于 2012-05-21T20:45:25.077 回答