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)   

这允许添加“第一篇文章”(带有空白的回复),并回复帖子甚至“回复回复”

例如,我的数据库中有这样的东西:

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 )。我以前没有使用过这个库,所以让我知道它是怎么回事。

模型.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']

视图.py

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

不,我认为没有办法一次加载所有回复。

但是,您可以向帖子类型添加额外的元数据,以便能够运行有序样式的查询,其中计算回复的数量变成了一个简单的计算,其中已经为父节点加载了数据。

请参阅这篇文章,了解如何做到这一点(它使用 MySQL SQL 方言和 PHP,但原则仍然适用)。

基本上,您向树中定义排序的节点添加leftright字段,让您轻松计算树中给定根元素下方的项目数。它就像数据库表中的二叉树。原理取自这本优秀的数据库设计书籍:“Joe Celko's Trees and Hierarchies in SQL for Smarties”

于 2013-02-02T21:49:02.920 回答