在Djang中评论其他评论

2024-06-01 01:01:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个使用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)

我可以得到所有属于一个帖子的评论模板

^{pr2}$

但我需要评论其他评论。在

我可以通过

{% for comment in post.comments.all %}
    {{ comment }}

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

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

如何遍历属于该帖子的所有评论或属于该帖子的其他评论?在


Tags: text模型modelobjectmodelscomment评论content
2条回答

您可以向models模块添加一个函数,该函数遍历注释树并按顺序生成每个注释,如下所示:

# 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 traversal(以Post对象作为树根,因此它永远不会被“访问”,因为只需要Comment对象)。在

然后模板的工作方式如下:

^{pr2}$

然后,应遍历所有注释并以适当的顺序输出(即,在下一个顶级注释之前输出一个顶级注释的所有子体)。下一步是实现一种方法,让模板知道它所处的注释的“级别”。在

当然,这种方法(每个注释都有一个QuerySet调用)效率低下;但希望它能帮助您朝着正确的方向前进。在

我闻到了树的结构。
在Django中可以使用:django-mptt

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

它声称非常有效

相关问题 更多 >