3

子モデルを適切な方法で順序付けるモデルを作成したいと思います。たとえば、本には多くの章がありますが、章は特定の順序である必要があります。

次の質問が示唆するように、チャプターの順序を指定するIntegerFieldをチャプターモデルに配置する必要があると思います。djangoの順序付きリスト

私の主な問題は、2つの既存の章の間に新しい章を挿入したり、何らかの方法でそれらを並べ替えたりするときはいつでも、本のすべての章を(ほぼ)更新する必要があるということです。順序を変更するたびにすべてのチャプターのすべてのインデックスを手動で変更する必要を回避する方法はありますか(おそらく私が使用しているDjango Adminで)?

上記のリンクされた質問で提案されているように、私は「リンクリスト」スタイルのモデルを作成するのが好きではありません。データベース作成には適していないとの印象を受けているからです。

この関係をモデル化する「正しい」方法は何ですか?

4

2 に答える 2

2

2つの間に挿入するときに複数のアイテムを更新する問題を回避するために、整数の代わりにfloatを使用してください。

したがって、アイテム42とアイテム43の間にアイテムを挿入する場合は、2つの中間の注文値(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以降の場合:これを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 に答える