쿼리를 한 번 만 날려서 post에 딸린 comment들을 10개만 가져오고 싶을 때 어떻

 
Dae-won Seo

쿼리를 한 번 만 날려서 post에 딸린 comment들을 10개만 가져오고 싶을 때 어떻게 하면 좋을까요?

Post.objects.prefetch_related(Prefetch(‘comments’, queryset=Comment.objects.order_by(‘-created_at’).all()[:10]))

은 안 되더라구요 ㅜ ㅜ

  • 양희찬

    Comment.objects.all().order_by(‘-created_at’).all()[:10]로 해보셨나요?

    Yuk Seungchan

    전체를 가져와서 리스트에서 열개만 보내는것보다 limit을 사용하여 쿼리에서 10개만 가져오도록 하는게 좋습니다

    Hyunjun Kim

    Django 문서에 보면 QuerySet이 리스트 슬라이스 프로토콜을 SQL Limit/Offset 으로 구현해두었다고 나와있습니다. https://docs.djangoproject.com/ja/1.9/topics/db/queries/#limiting-querysets

    Dae-won Seo

    일단 다음과 같이 해결했습니다.

    posts = Post.objects.prefetch_related(‘comments’).all()
    if posts:
    ….for post in posts:
    ……..comments = account.comments.all()[:3]

    더 좋은 방법이 있으면 공유 부탁드립니다 ㅜㅜ

    박영록

    post별로 comments가 10개로 제한해서 가져오는 걸 원하신다면 그건 prefetch로 안됩니다. post 하나에 걸린 comment가 엄청나게 많다면 prefetch는 안 쓰는 게 나을 수도 있습니다. SQL로 직접 써도 제법 복잡한 쿼리를 써야 하고, 쿼리 한 방으로 결과를 나오게 한다고 해도 어차피 plan은 여러 번 쿼리하는 것과 비슷하게 나오기 때문에 별 의미는 없죠.

    가져와야 하는 post와 comment의 수가 많지 않다면 그냥 해결하신 코드처럼 쓰시는 게 답입니다. 다만 if posts: 부분은 불필요합니다. 만약 post와 comment가 둘다 많다면 comment는 on demand로 쿼리하도록 한다든가, 10개가 아니라 날짜로 제한한다든가 하는 식으로 UI를 변경하는 게 좋을 듯 하네요. 기술적인 문제라고 해서 기술로만 푸는 것보다 UI에서부터 기술을 감안한 설계가 들어가는 게 좋습니다.

Advertisements