스터디 목표
블로그 애플리케이션의 기능을 추가하여 작성하고 이해한다.
오답노트
모르는 코드 부분을 정확하게 이해하고 정리한다.
def post_detail(request, year, month, day, post):
post = get_object_or_404(Post, # 해당 객체가 없으면 404 에러
status=Post.Status.PUBLISHED,
slug=post,
publish__year=year,
publish__month=month,
publish__day=day)
# 이 글의 active 댓글 목록, 게시물에 대한 모든 활성 댓글을 조회하기 위해 추가한 것
comments = post.comments.filter(active=True).order_by('-created')
# 사용자가 댓글을 달 수 있는 폼(댓글 폼의 인스턴스를 생성한 것)
form = CommentForm()
# 유사한 게시물들의 목록
post_tags_ids = post.tags.values_list('id', flat=True)
similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=post.id)
similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags', '-publish')[:4]
return render(request,
'blog/post/detail.html',
{'post':post,
'comments':comments,
'form':form,
'similar_posts':similar_posts})
# ~ 상세 뷰 생성하기 / URL 패턴 수정하기
## 문제
comments = post.comments.filter(active=True)
## 해결
comments = post.comments.filter(active=True).order_by('-created')
문제의 원인 :
기본적으로 Django ORM에서 쿼리셋을 생성할 때, 정렬 순서는 모델의 Meta 클래스에 지정된 ordering 옵션을 따르거나, Meta 클래스에 ordering 옵션이 없는 경우 데이터베이스의 기본 정렬 순서에 따른다. 만약 Comment 모델에 ordering 옵션이 설정되지 않았다면, 댓글은 생성된 순서대로(즉, 오래된 순서대로) 반환될 수 있다.
해결 방법 :
order_by('-created')를 추가하면 댓글을 created 필드를 기준으로 내림차순으로 정렬한다. 여기서 '-created'는 created 필드의 값을 기준으로 내림차순 정렬을 의미하는데 즉, 가장 최근에 작성된 댓글이 쿼리셋의 첫 번째 항목이 된다.