我有一个名为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
是否可以一次加载所有相关帖子? 我需要它主要是计算所有回复的第一篇文章。
答案 0 :(得分:4)
您可以使用MPTT(http://django-mptt.github.com/django-mptt/tutorial.html#the-problem)。我之前没有使用过这个库,所以让我知道它是怎么回事。
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']
....
r = FirstPost.get_children()
答案 1 :(得分:0)
不,我认为没有办法立即加载所有回复。
但是,您可以向帖子类型添加额外的元数据,以便能够运行有序样式查询,其中计数回复数量变为简单计算,其中已为父节点加载了数据。
请参阅this article有关如何做到这一点(它使用MySQL SQL方言和PHP,但原则仍然适用)。
基本上,您将left
和right
字段添加到树中定义排序的节点,以便您轻松计算给定根元素下下面的项目数在树上。它就像数据库表中的二叉树。原理取自这本优秀的数据库设计书:"Joe Celko's Trees and Hierarchies in SQL for Smarties"。