django get_queryset() 그리고 queryset의 차이 정리 get_context_data()까지

2019-04-16

참조

https://stackoverflow.com/questions/19707237/use-get-queryset-method-or-set-queryset-variable https://beomi.github.io/2017/08/25/DjangoCBV-queryset-vs-get_queryset/ https://stackoverflow.com/questions/36950416/when-to-use-get-get-queryset-get-context-data-in-django


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'
    queryset = Poll.active.order_by('-pub_date')[:5]
class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        return Poll.active.order_by('-pub_date')[:5]

질문 : 두 코드 간의 다른 점이 무엇인가? 무엇을 사용하는게 더 나은가? 혹은 get_queryset method를 오버라이드 하는것 보다 queryset을 세팅하는게 언제 나은가?

대답 : 오버라이딩 한 querysetget_queryset은 같은 효과를 낸다. 하지만 덜 지저분하기 때문에 queryset을 세팅해 사용하는것을 선호한다.

queryset은 서버를 시작할 때 단 한번만 queryset을 생성한다. 혹은 request 발생시 한번만 queryset이 동작한다. 반면에 get_queryset method는 매번 쿼리를 발생시킨다. 즉 get_queryset은 쿼리를 동적으로 사용하고 싶을때 유용하다. 예를 들어 현재 유저에게 objects를 보여주고 싶다.

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that belong to the current user"""
        return Poll.active.filter(user=self.request.user).order_by('-pub_date')[:5]

callable을 기반으로 filter를 사용하고 싶을 때도 유용하다. (정확히 모르겠다 ㅠㅠ)

class IndexView(generic.ListView):
    def get_queryset(self):
        """Returns Polls that were created today"""
        return Poll.active.filter(pub_date=date.today())

date.today() 같이 한번만 불러도 될 때는 아래와 같이 queryset을 사용해 위와 같은 기능을 만들 수 있다.

class IndexView(generic.ListView):
    # don't do this!
    queryset = Poll.active.filter(pub_date=date.today())

그러나 이 말은 곧 queryset은 값을 이전에 이미 불러온것이기 때문에 새로 만들어도 refresh는 되지 않는다. refresh를 하고 싶으면 process 자체를 재시작 해야한다.


아래 get_context_data()를 위한 ListView 예제

class FilteredAuthorView(ListView):
    template_name = 'authors.html'
    model = Author

    def get_queryset(self):
        # original qs
        qs = super().get_queryset() 
        # filter by a variable captured from url, for example
        return qs.filter(name__startswith=self.kwargs['name'])

get_context_data()

이 method는 template context로 사용하려 할 때 dictionary로 데이터를 만들어 줄력한다. 예를 들어 위의 예제에서 author_listget_queryset()로 부터 결과를 만들어 출력해야 한다. get_context_data()를 오버라이딩해서 템플릿에 보여줄 것이다.

def get_context_data(self, **kwargs):
    data = super().get_context_data(**kwargs)
    data['page_title'] = 'Authors'
    return data

이러한 변수로 참조해 템플릿에 보여줄 수 있다.

<h1></h1>

<ul>

</ul>