1

У меня есть модель для комментариев, которая использует GenericForeignKey и модель для сообщений.Другие комментарии в Django

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 %} 

Таким образом, я могу только получить определенное количество уровней.

Как я могу отслеживать все комментарии, принадлежащие сообщению, или принадлежащие другим комментариям, принадлежащим к сообщению?

ответ

1

Я чувствую запах структуры дерева здесь.
Для этого в Django вы можете использовать: django-mptt

Он добавляет несколько столбцов в таблицу и a lot usefull stuff работать с моделью в виде древовидной структуры.

И он утверждает, что является очень эффективным

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 объект как корень дерева, поэтому он никогда не «посещается», так как нужны только Comment объектов).

Тогда шаблон будет выглядеть так:

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

Все комментарии должны затем быть пройдена и выход в правильном порядке (т.е. все потомками одного верхнего уровня комментарий выводится перед следующей Топ- уровень комментария). Следующим шагом будет реализовать способ, которым шаблон должен знать, какой «уровень» комментария он включен.

Этот метод, с запросом QuerySet за комментарий, неэффективен, конечно; но, надеюсь, это поможет вам в правильном направлении.