[django] Django에서 빈 쿼리 세트 확인
쿼리가 결과를 반환했는지 확인하기 위해 권장되는 관용구는 무엇입니까?
예:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
나는 이것을 확인하는 몇 가지 다른 방법이 있다고 생각하지만 숙련 된 장고 사용자가 어떻게 할 것인지 알고 싶습니다. 문서의 대부분의 예제는 아무것도 발견되지 않은 경우를 무시합니다 …
답변
if not orgs:
# Do this...
else:
# Do that...
답변
1.2 버전부터 Django에는 QuerySet이 있습니다. 가장 효율적인 존재 () 메소드 :
if orgs.exists():
# Do this...
else:
# Do that...
그러나 QuerySet을 평가하려는 경우 다음을 사용하는 것이 좋습니다.
if orgs:
...
자세한 내용 은 QuerySet.exists () documentation 를 참조하십시오 .
답변
많은 수의 객체가있는 경우 (때로는) 훨씬 빠를 수 있습니다.
try:
orgs[0]
# If you get here, it exists...
except IndexError:
# Doesn't exist!
거대한 데이터베이스로 작업하고있는 프로젝트에서 not orgs
400 + ms이며 orgs.count()
250ms입니다. 가장 일반적인 사용 사례 (결과가있는 경우) 에서이 기술은 종종 20ms 미만으로 떨어집니다. (내가 찾은 한 사례는 6이었습니다.)
물론 데이터베이스가 결과를 찾는 데 얼마나 멀리 있는지에 따라 훨씬 길어질 수 있습니다. 또는 더 빨리 찾으면 더 빠릅니다. YMMV.
편집 : 이것은 것입니다 종종 느린보다 orgs.count()
결과가 발견되지 않는 경우가 필터링하고있는 조건이 희귀 한 특히 경우; 결과적으로 뷰가 존재하는지 확인하거나 Http404를 발생시켜야하는 뷰 함수에 특히 유용합니다. 사람들은 희망하는 곳에서 더 자주 존재하는 URL을 요구하고 있습니다.
답변
쿼리 집합의 공허함을 확인하려면
if orgs.exists():
# Do something
또는 쿼리 세트에서 첫 번째 항목을 확인할 수 있습니다. 존재하지 않는 경우 다음을 반환합니다 None
.
if orgs.first():
# Do something
답변
가장 효율적인 방법 (django 1.2 이전)은 다음과 같습니다.
if orgs.count() == 0:
# no results
else:
# alrigh! let's continue...
답변
나는 술어에 동의하지 않는다
if not orgs:
그것은해야한다
if not orgs.count():
상당히 큰 결과 세트 (~ 150k 결과)와 동일한 문제가 발생했습니다. 연산자는 QuerySet에서 오버로드되지 않으므로 결과는 실제로 확인하기 전에 목록으로 압축 해제됩니다. 필자의 경우 실행 시간이 3 회 줄었습니다.
답변
이것을 사용할 수도 있습니다 :
if(not(orgs)):
#if orgs is empty
else:
#if orgs is not empty