2011-12-24 3 views
1

나는 필터를 읽고 장고 문서에서 제외하지만 난 다음 코드를 사용할 경우 알고 싶어요 :django 필터는 성능에 영향을 미치지 않습니까?

다음
Entry.objects.filter(
    ...  headline__startswith='What' 
    ...).exclude(
...  pub_date__gte=datetime.now() 
...).filter(
...  pub_date__gte=datetime(2005, 1, 1) 
...) 

,은 1 개 쿼리 또는 4 개 쿼리 결과됩니다? 먼저 쿼리하고 모든 개체를 얻은 다음 mysql/db에서 모든 레코드를 가져온 후 필터링 및 제외하거나 mysql/db 수준에서 모두 수행합니다. db 레벨에서 수행되지 않으면 성능 문제가 발생할 수 있기 때문입니다. 그게 내가 필터링하고 응용 프로그램 수준이나 DB 수준에서 작업을 제외한다는 것을 알고 싶어?

답변

1

내 질문의 대답을 얻었다, 즉 :

검색어 세트가 게으른 - 검색어 세트를 만드는 작업은 포함되지 않습니다 자신의 장고 문서에 말했듯이 쿼리는 한 번만 실행됩니다 데이터베이스 활동. Django는 QuerySet이 평가 될 때까지 실제로 쿼리를 실행하지 않을 것입니다. 과 이 데이터베이스는 세 번의 데이터베이스 히트와 비슷하지만 실제로 데이터베이스를 마지막 라인에서 한 번만 방문합니다 (q를 인쇄하십시오.). 일반적으로 QuerySet의 결과는 사용자가 "요청"할 때까지 데이터베이스에서 가져 오지 않습니다. 그렇게하면 QuerySet은 데이터베이스에 액세스하여 평가됩니다. 평가가 정확히 수행되는시기에 대한 자세한 내용은 "When QuerySets are evaluated"을 참조하십시오.

0

하피즈의 대답을 조금만 끝내기 위해 여기에 그의 설명 코드를 붙여 넣었습니다. (링크를 제공 했는데도 print(q)을 추천했을 때 조금 잃어 버렸습니다.)

>>> q = Entry.objects.filter(headline__startswith="What") 
>>> q = q.filter(pub_date__lte=datetime.date.today()) 
>>> q = q.exclude(body_text__icontains="food") 
>>> print(q) 
관련 문제