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을 세팅해 사용하는것을 선호한다.
>>> 느낀바로는 get_queryset은 Class 형 뷰를 할 때 전체 리스트를 보내거나 일부 제한된 리스트르 부르기 위해서 사용되어지는것 같음.
그렇다면? 만일 다른 모델의 내용을 뷰에서 가져와야 된다면??
그때, get_context_data()함수를 사용해서 사용하면된다!!
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>
아래 블로그를 퍼왔습니다!!
190413 django Virtualenv, requirements 정리Oracle DB 공부한것 정리
'프로그래밍 > Django개발(MAC OS)' 카테고리의 다른 글
Django Model 자주 사용하는 메서드 (0) | 2019.11.28 |
---|---|
Django_ Slug Url 한글 오류 해결 방법 (0) | 2019.11.26 |
Django_ values(), values_list(), flat 옵션 (0) | 2019.11.26 |
Django 소셜 로그인 구현 - Naver (0) | 2019.11.22 |
Pycharm 단축키 정리 (펌) (0) | 2019.11.21 |