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

여기 나무 구조가 냄새가납니다. 당신이 사용할 수있는 장고이 들어
: 그것은 당신의 테이블과 a lot usefull stuff에 여러 열을 추가 django-mptt

는 트리 구조로 모델과 함께 작동합니다.

매우 효율적이라고 주장합니다.

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 개체를 트리 루트로 사용하므로 Comment 개체 만 필요하므로 "방문하지"않습니다.

그런 다음 템플릿은 다음과 같이 작동합니다 :

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

모든 의견은 통과되어야 적절한 순서 출력 (즉, 하나의 최상위 주석의 모든 후손은 다음 표 · 전 출력 레벨 코멘트). 다음 단계는 템플리트가 주석의 "레벨"을 알 수있는 방법을 구현하는 것입니다.

이 메서드는 주석 당 QuerySet 호출을 사용하므로 물론 비효율적입니다. 그러나 바라건대 그것은 올바른 방향으로 당신을 조종하는 것을 도울 것입니다.