Django QuerySet의 개수 대 len
Django에서 QuerySet
반복하여 결과를 인쇄 할 것이있는 경우 개체 수를 계산하는 데 가장 좋은 옵션은 무엇입니까? len(qs)
또는 qs.count()
?
(그리고 동일한 객체에서 객체를 계산하는 것입니다.)
하지만 장고 워드 프로세서 사용을 권장 count
하기보다는 len
:
참고 :
len()
집합의 레코드 수를 확인하기 만하면되는 경우 QuerySets에서 사용하지 않습니다 . SQL을 사용하여 데이터베이스 수준에서 발표를 처리하는 것이 훨씬 더 처음SELECT COUNT(*)
이며 Django는count()
정확하게 선언적 방법을 제공합니다 .
어쨌든이 검색어 세트를 반복하고 있기 때문에, 결과는 캐시됩니다 (당신이 사용하지 않는 경우 ), 그리고 그것을 사용하는 것이 좋습니다 할 수 있기 때문에, 이 피합니다. 그리고 !). 을 사용하는 경우 라면 (count를 사용하는 대신) 반복 할 때 계수 변수를 포함하는 것이 좋습니다.iterator
len
iterator
len()
와 사이 의 선택 count()
은 상황에 따라 다르며 사용하기 위해 작동하는 방법을 깊이 이해하는 것이 좋습니다.
몇 가지 시나리오를 제공하겠습니다.
(가장 중요) 요소 수만 알고 싶고 어떤 식 으로든 처리 할 계획이없는 경우
count()
다음 을 사용하는 것이 중요합니다 .DO :
queryset.count()
-단일 단일SELECT COUNT(*) some_table
쿼리 를 수행 하고 모든 계산은 RDBMS 측에서 수행 할 Python은 고정 비용 O (1)로 결과 번호를 검색합니다.하지 말아야 할 사항 :
len(queryset)
-SELECT * FROM some_table
쿼리 를 수행하고 전체 테이블 O (N)를 가져오고이를 저장하기 위해 추가 O (N)가 필요합니다. 할 수있는 최악의 상황어쨌든
len()
쿼리 세트 를 가져 오려는 경우 추가 데이터베이스 쿼리가 발생하지 않는 것이 사용 하는 것이 약간 더 좋습니다count()
.len(queryset) # fetching all the data - NO extra cost - data would be fetched anyway in the for loop for obj in queryset: # data is already fetched by len() - using cache pass
성과 :
queryset.count() # this will perform an extra db query - len() did not for obj in queryset: # fetching data pass
두 번째 경우 되돌림 (쿼리 세트를 이미 장비 경우) :
for obj in queryset: # iteration fetches the data len(queryset) # using already cached data - O(1) no extra cost queryset.count() # using cache - O(1) no extra db query len(queryset) # the same O(1) queryset.count() # the same: no query, O(1)
"내부"를 보면 모든 것이 명확해질 것입니다.
class QuerySet(object):
def __init__(self, model=None, query=None, using=None, hints=None):
# (...)
self._result_cache = None
def __len__(self):
self._fetch_all()
return len(self._result_cache)
def _fetch_all(self):
if self._result_cache is None:
self._result_cache = list(self.iterator())
if self._prefetch_related_lookups and not self._prefetch_done:
self._prefetch_related_objects()
def count(self):
if self._result_cache is not None:
return len(self._result_cache)
return self.query.get_count(using=self.db)
Django 문서의 좋은 참조 :
len(qs)
결과를 반복해야하므로 여기서 사용하는 것이 더 합리적 이라고 생각 합니다. qs.count()
원하는 모든 작업이 결과를 반복하지 않고 카운트를 인쇄하는 경우 더 나은 옵션입니다.
len(qs)
는 데이터베이스를 치는 select * from table
반면 .qs.count()
select count(*) from table
또한 qs.count()
반환 정수를 제공하고 반복 할 수 없습니다.
참고 URL : https://stackoverflow.com/questions/14327036/count-vs-len-on-a-django-queryset
'ProgramingTip' 카테고리의 다른 글
JavaScript를 사용하여 AngularJS Bootstrap UI에서 모달 창 호출 (0) | 2020.10.23 |
---|---|
JavaScript로 모바일 장치를 감지하는 방법은 무엇입니까? (0) | 2020.10.23 |
휴식을 사용하여 Java에서 루프를 종료하는 것이 나쁜 습관입니까? (0) | 2020.10.23 |
장고 템플릿에서 쿼리 필터링을 수행하는 방법 (0) | 2020.10.23 |
Android Studio에서 자산 폴더 추가 (0) | 2020.10.22 |