Django - 使用树构建评论系统

时间:2009-12-22 15:42:48

标签: python django tree

几天前,当我决定尝试构建一个简单的论坛时,我正在弄乱Django,试图了解它的工作原理,这个论坛类似于我经常光顾的论坛(但现在关闭了) 。这个想法是每个评论都是任意数量评论的父母,如下:

 comment <--top
   comment <-- comment "A"
   comment <-- comment "B"
   comment <-- comment "C"
     comment <--C-1, reply to comment "C"
       comment <-- C-1-1, reply to comment "C-1"
         comment 
           comment 
             comment
         comment <-- C-1-1-1 reply to C-1-1
         comment 
         comment
           comment
             comment
     comment
     comment
       comment
         comment
           comment
             comment
             comment
             comment

这里的想法是对评论的回复会在其下面填充一个级别,除了第一个评论之外,每个评论都有一个父级。问题是,虽然我得到了实现树遍历背后的想法,但我读过的关于这个主题的书/文章都没有考虑到Django(或者MVC模式),所以我的问题是我将如何进行在Django中实现这个系统? (这是我参考的型号代码: - /)

class Comment(models.Model): 
 Parent = models.OneToOneField('self', null=True)
 Children = models.ForeignKey('self', null=True)

 Author = models.ForeignKey(User)
        Author_IP = models.IPAddressField()
 Created_On = models.DateTimeField(auto_now_add=True)
 Modified_On = models.DateTimeField(auto_now=True)
 Body = models.TextField()

2 个答案:

答案 0 :(得分:2)

看看django-threadedcomments。它的目的更适合用作博客上的评论而非全功能论坛,但如果它不适合您的情况,您至少可以查看源代码并从中学习一些东西。

对于基于树的结构,我知道Django的ORM有三个项目:django-mptt(这个与第三方django应用程序AFAIK有最大的“市场份额”),{{ 3}}和django-treebeard(基于treebeard)。 Easytree带有一个很好的管理界面,但是其他两个项目在他们的问题跟踪器中至少有补丁来添加管理界面(不确定他们是否已经集成了这些补丁)。

答案 1 :(得分:1)

我只会定义父级并给它一个相关名称

class Comment(models.Model):
  parent=models.ForeignKey('self', related_name="children", null=True, blank=True)
  #other fields 

然后你可以得到它的孩子

comment=Comment.objects.get(id=1)
children=comment.children.all()

for child in children:
  morechildren=child.children.all()