立即加载关系树

时间:2013-02-02 21:41:50

标签: python django django-queryset django-orm

我有一个名为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)   

这允许添加“首发帖子”(空白回复_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

是否可以一次加载所有相关帖子? 我需要它主要是计算所有回复的第一篇文章。

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

不,我认为没有办法立即加载所有回复。

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

请参阅this article有关如何做到这一点(它使用MySQL SQL方言和PHP,但原则仍然适用)。

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