본문 바로가기

프로그래밍/Django개발(MAC OS)

Django_ get_queryset()과 queryset에 대한 차이 정리

반응형

 

 

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 공부한것 정리 

 

Oracle DB 공부한것 정리

conn 계정명 - 로그인 show user - user 보여줌 create user 계정명 identified by 비밀번호 - 계정 생성 grant connect, resource, dba to 계정명 - 기본 권한 부여

pjs21s.github.io

 

반응형