'쿼리셋은 게으르다'
쿼리셋을 만드는 작업에는 데이터베이스 작업이 포함되지 않음
하루종일 필터를 함께 쌓을 수 있으며 (stack filters), Django는 쿼리셋이 '평가(evaluated) ' 될 때까지 실제로 쿼리를 실행하지 않음
DB에 쿼리를 전달하는 일이 웹 애플리케이션을 느려지게 하는 주범 중 하나이기 때문
다음 구문에서 몇개의 쿼리가 DB에 전달될까?
articles = Article.objects.filter(title__startswith='What')
articles = articles.filter(created_at__lte=datetime.date.today())
articles = articles.exclude(content__icontains='food')
print(articles)
Iteration
for article in Article.objects.all() :
print(article.title)
bool()
if Article.objects.filter(title='Test') :
print('hello')
이외 Pickling/Caching, Slicing, repr(), len(), list() 에서 평가 됨
#나쁜 예 (동일한 데이터베이스 쿼라기 두번 실행)
print([article.title for article in Article.objects.all()])
print([article.content for article in Article.objects.all()])
# 좋은 예
queryset= Article.objects.all()
print([article.title for article in queryset])
print([article.content for article in queryset])
queryset = Article.objects.all()
print(queryset[5]) #호출
print(queryset[5]) #한 번 더
[article for article in queryset]
print(queryset[5]) #캐시 사용
print(queryset[5]) #캐시 사용
with 템플릿 태그 사용하기
{% with followers=person.followers.all followings=person.followings.all %}
<div>
팔로워 : {{folowers|length}}/ 팔로잉 {{followings|length}}
</div>
{% endwith %}
iterator() 사용하기