[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 orgs400 + 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