2016-04-12 7 views
2

テーブルの値をユーザーが並べ替えることができ、新しい値を追加して古い値を削除できるDjangoアプリケーションがあります。ユーザー変更可能なカスタムオーダーのDjangoモデルフィールド

これを行う「正しい」方法は何ですか?

Iは、order = models.IntegerField()

を定義し、正しいカスタム順序を作成するために、正しい値に行ごとにユーザによって定義されるように設定できました。しかし、これには、すべての再注文に変更後のすべての行が新しいorderで更新される必要があるという大きな欠点があります。コードを少しスマートにし、前と次の中間に選択されたIntegerを定義することもできますが、それでも時折競合が発生し、すべての行を更新する必要があることを意味します。

解決策の1つは、フロートを使用することです。次に、挿入された行の順序は、前と次の中間になります。特に、行の数が非常に多くなった場合は、順序付けに浮動小数点を使用する際に問題がありますか?

このようなものを処理するには、より優れた/よりスマートな/組み込みの方法がありますか?

+0

データベースを注文しないでください。ユーザーに表示されているものだけですので、それを作るクエリーセットを注文するか、ユーザーの注文プリファレンスを保存する方法を提供してください – Sayse

+0

申し訳ありませんが、私ははっきりしていませんでした。 (クエリーセットの注文/ユーザー設定の保存)。私が思っていることは、それを行う正しい方法は何ですか(調整や挿入/削除などがたくさんある場合) – EMon

+0

あなたの質問は、いつも瑕疵がある注文を保存することです。あなたは注文の優先度を格納する必要があります。たとえば、スタックオーバーフローの回答は、それらがどれくらい積極的であるか、投票数がどれくらいあるかによって決めることができます。 – Sayse

答えて

2

もう少し巧妙な解決策を聞いてみたいと思っていますが、私が使用しているのは整数桁のフィールドより単純なものはないとは思っていません。

値の競合を避けるには、ユーザーがこの値を直接カスタマイズできるようにする必要があります。何らかの順序付けGUI(ドラッグアンドドロップなど)に基づいて自動的に舞台裏で行う必要があります。

ワークフローは、ユーザーにリストを表示し、必要に応じて並べ替えを行い、リスト全体を順番に提出し、すべてのレコードの順序を更新します(1から始まり+1)。

ユーザーが時々一対のアイテムを交換したり、新しいアイテムを真ん中に挿入したりすることが予想される場合は、リストを手動でループすることなくUPDATEクエリを使用して注文を更新できます(UPDATE table set orderid = orderid + 1 where orderid >= :position)。特定の位置など)。

DB更新のパフォーマンスを心配するために、そのリストにあまりにも多くのエントリを入れてはいけません。ユーザは何とか手動でアイテムを並べ替えると予想されるため、100万レコードをソートすることはできません。そうであれば、ユーザーが注文しているアイテムの数を管理できるように、何か特別な作業をする必要があるかもしれません。

+0

ありがとう!試してみることができるgithub.com/jpwatts/django-positionsを見つけましたが、そのパッケージにはいくつかの既存のバグがあります。このアプリは、ユーザーが大きなリストの小さな部分を編集できるように拡張できる非ゼロの可能性があるとは思いますが(実際には数百万のエントリが存在するかもしれません)。浮動小数点の考え方、あるいは「広範囲の整数」の考え方を考えましたか? – EMon

+0

このパッケージは、前のコメントで述べたdjango-positionsよりも優れているかもしれません: – EMon

+0

いくつかのギャップ(100,200、...)を持つ浮動小数点数と整数あなた自身で手動で番号を変更すると良いですが、dbで時々1つの番号を変更して忘れることができるのは便利です。自動的に実行する場合は、いくつかの追加チェックを追加する必要があります。これは、よりシンプルなオプションの目的を無効にする可能性があります。私はこれらのライブラリを一切使っておらず、彼らに試してみましょう。まだ便利なかもしれないいくつかの便利なラッパーを使って、整数の順序フィールドを使っているように聞こえます。 – serg

関連する問題