0

Postというモデルがあります。

class Post(models.Model):
    poster = models.ForeignKey(User)
    content = models.TextField(verbose_name='Text', max_length=1000)
    reply_to = models.ForeignKey('self', null=True, blank=True, default=None)   

これにより、「最初の投稿」(reply_toが空白)を追加し、投稿に返信したり、「返信に返信」したりすることができます。

たとえば、データベースには次のようなものがあります。

First Post
    Reply one
        Reply to reply one
    Reply two
        Reply to reply two

その返信ツリーをロードする方法は?

私が使用するとき:

r = Post.objects.filter(reply_to=FirstPost)

もちろん戻ります:

Reply one
Reply two

関連するすべての投稿を一度に読み込むことはできますか?主に最初の投稿へのすべての返信をカウントするために必要です。

4

2 に答える 2

4

MPTT(http://django-mptt.github.com/django-mptt/tutorial.html#the-problem)を使用できます。私はこれまでこのライブラリを使用したことがないので、どうなるか教えてください。

models.py

class Post(MPTTModel):
    poster = models.ForeignKey(User)
    content = models.TextField(verbose_name='Text', max_length=1000)
    parent = models.TreeForeignKey('self', null=True, blank=True, related_name='children')
    class MPTTMeta:
        order_insertion_by = ['poster']

views.py

 ....
 r = FirstPost.get_children()
于 2013-02-02T22:08:27.640 に答える
0

いいえ、すべての返信を一度に読み込む方法はないと思います。

ただし、投稿タイプにメタデータを追加して、順序どおりのクエリを実行できるようにすることができます。この場合、応答の数をカウントすると、親ノードにデータが既に読み込まれている簡単な計算になります。

これを行う方法については、この記事を参照してください(MySQL SQLダイアレクトとPHPを使用しますが、原則は引き続き適用されます)。

基本的に、順序を定義するフィールドをツリー内のノードに追加するleftと、ツリー内の特定のルート要素のrightにあるアイテムの数を簡単に数えることができます。これは、データベーステーブルのバイナリツリーのようなものです。原則は、この優れたデータベース設計書「Joe Celko's Trees and Hierarchies in SQLforSmarties」から引用されています。

于 2013-02-02T21:49:02.920 に答える