Queryset.exists()가 Queryset.count()보다 효율적인 이유

3737 단어 djangopythonwebdev
코드베이스 검토 봇으로 일하는 동안 저는 이 안티 패턴의 많은 변형을 보았습니다.

import models 

queryset = models.Hound.objects.filter(is_asleep=True)


if queryset.count() > 0:
    return "run away!"
else:
    return "coast is clear"



숙련된 Django 개발자는 count() 의 오용에 대해 웃을 수 있습니다. 나는 결코 그런 실수를 하지 않을 것입니다! 문제는 개발자가 섬이 아니라는 것입니다. 시간이 지남에 따라 개발자는 팀을 변경하고 기술 부채가 누적된 브라운필드 코드베이스를 상속하며 주니어 개발자가 작성한 코드를 검토합니다. 따라서 다음이 중요합니다.
  • 실수를 피하십시오
  • 실수를 효과적으로 찾고 수정하는 방법을 알고 있습니다
  • .
  • Django가 exists 더 빠르게
  • 하는 것을 전달하는 방법을 알고 있습니다.

    게시물의 끝에서 이 안티 패턴을 쉽게 찾아 수정하는 방법을 보여 드리겠습니다.

    능률



    비교queryset.count()는 확인queryset.exists()보다 덜 효율적입니다. 위의 예는 다음과 같이 읽기 어렵고 덜 효율적인 변형입니다.

    import models 
    
    queryset = models.Hound.objects.filter(pk=1)
    
    
    if queryset.exists():
        return "run away!"
    else:
        return "coast is clear"
    
    


    Django docs은 개수만 원하는 경우에는 querySet.count()를 사용하고, 하나 이상의 결과가 존재하는지 확인하려는 경우에만 queryset.exists()를 사용하도록 지시합니다.

    이 조언이 필요한 이유는 queryset.count()가 합계를 계산하기 위해 데이터베이스 테이블의 모든 행을 스캔하는 SQL 작업을 수행하기 때문입니다. 반면에 queryset.exists()는 단순히 the most optimized way에서 단일 레코드를 읽습니다.
  • 주문 제거
  • 그룹화 제거
  • 쿼리 세트
  • 에서 개발 정의select_relateddistinct를 지웁니다.

    코드베이스가 queryset.count를 오용하고 있습니까?



    시간이 지남에 따라 기술 부채가 코드베이스에 빠져들기 쉽습니다. django.doctor에서 확인하거나 review your GitHub PRs에서 확인할 수 있습니다.



    또는 시도해 보십시오Django refactor challenges .

    좋은 웹페이지 즐겨찾기