评论Django的其他评论

时间:2014-10-15 22:59:25

标签: python django django-models django-views django-generic-views

我有一个评论模型,使用GenericForeignKey和帖子模型。

class Comment(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    text = models.TextField()
    comments = generic.GenericRelation('self')

class Post(models.Model):
    title = models.CharField(max_length=50)
    text = models.TextField()
    comments = generic.GenericRelation(Comment)

我可以使用

获取属于模板中帖子的所有评论
{% for comment in post.comments.all %}
    {{ comment }}
{% endfor %}

但我需要评论其他评论。

我可以通过

获得“下一级别”的评论
{% for comment in post.comments.all %}
    {{ comment }}

    {% for sub_comment in comment.comments.all %}
        {{ sub_comment }}
    {% endfor %}
{% endfor %}

这样我只能得到指定数量的等级。

如何浏览属于帖子的所有评论或属于该帖子的其他评论?

2 个答案:

答案 0 :(得分:1)

您可以向遍历评论树的模型模块添加一个函数,并按顺序生成每个评论,如下所示:

# Note this will work given either a Post or Comment object
def traverse_comment_tree(obj_with_comments):
    for comment in obj_with_comments.comments.all():
        yield comment
        for descendant_comment in traverse_comment_tree(c):
            yield descendant_comment

class Post(models.Model):
    [...]
    def all_comments(self):
        return (c for c in traverse_comment_tree(self))

另外,请注意traverse_comment_tree基本上是pre-order depth-first traversalPost个对象作为树根,因此它永远不会被访问#34}需要Comment个对象。)

然后模板会像这样工作:

{% for comment in post.all_comments %}
    {{ comment }}
{% endfor %}

然后应遍历所有注释并以正确的顺序输出(即,在下一个顶级注释之前输出一个顶级注释的所有后代)。下一步是为模板实现一种方式,以了解哪个"级别"评论它是在。

这个方法,每个注释都有一个QuerySet调用,当然效率很低;但希望它能帮助你引导你走向正确的方向。

答案 1 :(得分:1)

我在这里闻到树的结构 对于Django,您可以使用:django-mptt

它会在您的表格中添加几列,并a lot usefull stuff将您的模型作为树结构使用。

它声称非常有效