我有一个评论模型,使用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 %}
这样我只能得到指定数量的等级。
如何浏览属于帖子的所有评论或属于该帖子的其他评论?
答案 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 traversal(Post
个对象作为树根,因此它永远不会被访问#34}需要Comment
个对象。)
然后模板会像这样工作:
{% for comment in post.all_comments %}
{{ comment }}
{% endfor %}
然后应遍历所有注释并以正确的顺序输出(即,在下一个顶级注释之前输出一个顶级注释的所有后代)。下一步是为模板实现一种方式,以了解哪个"级别"评论它是在。
这个方法,每个注释都有一个QuerySet调用,当然效率很低;但希望它能帮助你引导你走向正确的方向。
答案 1 :(得分:1)