django get_queryset() 그리고 queryset의 차이 정리 get_context_data()까지
참조
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
을 세팅하는게 언제 나은가?
대답 : 오버라이딩 한 queryset
과 get_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_list
에 get_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>