2017-11-08 7 views
0

Django의 개체를 필터링하는 가장 좋은 방법은 무엇입니까?장고에서 객체를 필터링하는 가장 실용적이고 효율적인 방법은 무엇입니까?

필자의 경우, GET request이 보낸 다른 매개 변수로 개체를 필터링해야합니다. 그래서, CBVget_queryset에 나는 내 사용자 지정 models.QuerySet의 사용자 정의 함수에 값을 전송하고 결과 검색 :

return MyModel.objects.all().custom_filter(param1, param2, param3) 

하지만 내 사용자 정의 기능에

, 가장 의심스러운 일들이 일어나고 있습니다.

  1. 처음에는 통과 된 값을 확인하고이를 정리합니다.
  2. 그런 다음, 모든 매개 변수에 대해 별도로 Q Objects을 사용하여 쿼리를 필터링합니다. 이것은 그 동안 잘 작동

    def custom_filter(self, param1, param2, param3): 
        # cleaning and checking staff 
        # ... then 
        result = self.filter(Q() | Q()) # related to param1 
        if (param2 != None): 
         result = result.filter(Q()) # related to param2 
        if (param3 != None): 
         result = result.filter(Q() & Q()) # related to param3 
        # and etc. 
        return result.distinct() 
    

: 같은 사용자 정의 models.QuerySet 그것은 보인다. 그러나 나는 그것이 확실히 비효율적 인라고 생각합니다. 더 좋은 해결책이 있다면 누구나 제공해주십시오.

답변

1

생각하지 마세요. 쿼리를 수행하는 데 얼마나 걸리나요? 배포하기 전에 제작 스타일 영역에서 테스트 할 수 있습니까?

모든 쿼리 세트에서 .query을보고 데이터베이스로 보낸 쿼리를 볼 수 있습니다. 이 방법으로 실제 쿼리를 보면 쿼리가 끔찍한 것인지 훨씬 더 잘 알 수 있습니다. 좀 더 고급 분석을 원하는 경우에

print unicode(MyModel.objects.all().custom_filter(param1, param2, param3).query) 

, 보통 나는이 걸릴 데이터베이스에 EXPLAIN ANALYSE로 팝. 그러면 데이터베이스에서 실제로 결과를 수집하는 데 사용하는 마법에 대한 전체 분석을 제공합니다. 이 방법에 대한 자세한 내용은 데이터베이스 설명서를 참조해야합니다.

마지막으로 - 가장 중요한 것은 - querysets only evaluate when they have to입니다. 제공 한 예제에서는 데이터베이스 쿼리가 전혀 작성되지 않습니다. 당신은 그것이 확실히 비효율적이라고 생각합니다. 그러나 당신이 그것을 생각할 이유는 없습니다.

+0

저는 장고에서 상당히 새로 왔습니다. 나는'QuerySet's가 게으름을 알지 못했습니다. – catscoolzhyk

+0

큰 차이가 있습니다 :) – Shadow