2010-12-11 18 views
1

Djangoのドキュメント(段落)リビジョンシステムを最適に実装する方法がわかりません。Django文書改訂システムで段落の順序を維持する方法は?

ドキュメントの改訂履歴を段落ごとに保存します。言い換えれば、ManyToManyFieldParagraphのクラスDocumentがあります。段落の順序を維持するために、第3のクラスParagraphContainerを作成することができる。

私の質問は、誰かが既存の段落の間に新しい段落を追加したときに段落の順序が維持されるように、これをDjangoで実装する良い方法は何ですか?

明白な方法の1つは、ParagraphContainerクラスのposition属性ですが、このフィールドは挿入(または削除)された段落に続くすべての段落で更新する必要があります。リンクされたリストは別のオプションですが、ドキュメント全体の取得には非常に時間がかかる恐れがあります。何かアドバイス?讲义1コースの

class Paragraph(models.Model): 
    text = models.TextField() 

class Document(models.Model): 
    paragraphs = models.ManyToManyField(Paragraph, through='DocumentParagraph') 

class DocumentParagraph(models.Model): 
    paragraph = models.ForeignKey(Paragraph) 
    document = models.ForeignKey(Document) 
    order = models.PositiveIntegerField() 

あなたがParagraph.saveをオーバーライドに見ることができるため、などの順序を更新するためのいくつかのカスタムメソッドを追加する必要があります:

答えて

2

編集者は、個テーブル表でこの問題を解決することがよくあります。テーブルは、a)メモリ内で連続し、b)共通の属性を共有する文字のスパンを指すオブジェクトのリストです。テーブル内のピースの順番は、ドキュメント内の文字アドレスをメモリにマッピングしたり、その逆にマッピングするために使用されます。ピーステーブルを並べ替えることで、何も動かさずにドキュメントを効果的に並べ替えることができます。要点は、ピーステーブル自体がドキュメントの内容を構成するオブジェクトとは独立していることです。

したがって、段落の順序をマッピングする1つの方法は、簡易版のピーステーブルを作成することです。これは、ドキュメント順のパラIDのリストと同じくらい簡単です。あなたが何かを変更する必要があるときは、リストをフェッチし、それをアンピクルして、リストのを編集して、pickleで保存します。

テーブルのもう1つの利点は、元に戻す実装を大幅に簡素化することです。ヒストリファイルはテーブルの編集の簡単なリストであり、元に戻す/やり直すことは、特定の編集を逆にするか、テーブルに再適用することの問題であり、データそのものは変更されません。これは、あなたがしたいバージョン管理でうまくいくはずです。

1

あなたはorder属性でthrough table to your ManyToManyFieldを追加する場合は、この問題を解決することができますたとえば、post_save -signalを使用してください。

+0

Paragraph.saveのオーバーライドをお寄せいただき、ありがとうございます。あなたの答えは、基本的に私の 'position'属性(あなたの' order')で気にしていたものですが、挿入された後の他の段落をすべて更新することになり、1000段落を超えると)。あるいは、挿入効率と検索効率との間にトレードオフが必要なケースのほんの1つですか? –

+0

もちろん、段落を追加したり取得したりすることは、そのソリューションでは非常に簡単です。挿入にはそれに比べて時間がかかります。私はあなたが再オーダリングが必要なオブジェクトの数と、ユースケースの挿入がどれほど一般的であるかを調べるために、あなたのケースを評価する必要があると思います。私はまた、 '次の'段落を指している 'ForeignKey'を持つソリューションを考えることもできますが、dbの順序付け関数を使用することができないので、これは検索に関してもっと複雑です... –

+0

私はしばらく誰かが斬新な解決策を考えているかどうかを確認してください。そうでなければ、私はあなたの答えを受け入れます、ありがとう! –

関連する問題